• Wieder einmal haben uns unsere Apfeltalker tolle Fotos zur Abstimmung eingesandt. Welches ist Euer Favorit? Stimmt mit ab! Hier geht es zur Abstimmung --> Klick
  • Es ist bereits Apfeltalk-Tradition und wir möchten sie auch in diesem Jahr fortsetzen: Unser Apfeltalk-Weihnachtslogo-Wettbewerb hat begonnen! Gestaltet für uns das Weihnachtsbanner, das im Monat Dezember bis zum Weihnachtsfest unsere Webseite schmücken soll. Lasst Eurer Kreativität freien Lauf! Hier geht es zum Wettbewerb --> Klick

IBOutlet in purer c Funktion undeclared

BenjiBenji

Alkmene
Registriert
11.03.09
Beiträge
32
Guten Abend,

für eine einfache Operation habe ich innerhalb einer Objective-C Klasse eine pure c Funktion.

Nun würde ich aber doch gerne einem Textfeld über ein IBOutlet einen Text zukommen lassen, nur leider scheint dieses in der Funktion nicht sichtbar zu sein.

Klasse.h
<
...

@interface Klasse : NSObject
{
IBOutlet id textfeld;
}
>

Klasse.m
<
void Midi(einige Übergaben)
{
// stellt Dinge mit Midi Signalen an.
[textfeld setStringValue:@"Signal war da"]; //textfeld undeclared
}
>

Wüßte mir da eventuell jemand Rat?


netten Gruß
Benji
 
Hallo,

warum sollte man das so umsetzen?

Besser ist doch eine "normale" Methode:

Code:
-(void)doSomething:(NSDictionary*)infos {...

... schließlich ist das IBOutlet auch eine Eigenschaft von "Klasse".

Viele Grüße
 
Weil ich beim kreieren eines Midi Ports eine Funktion -MIDIReadProc readProc- angeben muss, die aufgerufen wird, sobald der MidiVerwaltungsapparat feststellt, dass ein Midi Signal reinkam:

MIDIInputPortCreate(<MIDIClientRef client>, <CFStringRef portName>, <MIDIReadProc readProc>, <void *refCo>, <MIDIPortRef *outPort>);

...und das funktioniert nur, wenn ich eine normale Funktion definiere.

nette Grüße
Benji
 
Versuch's mal mit

Code:
Klasse.h
<
...

@interface Klasse : NSObject
{
IBOutlet NSTextField* textfeld;
}

- (IBAction)Midi:(id)sender <und einige Übergaben>;
>

Klasse.m
<
- (IBAction)Midi:(id)sender <und einige Übergaben>;
{
// stellt Dinge mit Midi Signalen an.
[textfeld setStringValue:@"Signal war da"]; //textfeld undeclared
}
>

Alle Angaben ohne Gewähr - bin Objective-C Anfänger ;-)

HTH,
Dirk
 
Das wird so wahrscheinlich nicht funktionieren! ;)

Man kann über einen etwas unsauberen Weg auf die Controller-Instanz und somit auf die Outlets zugreifen. Dafür legt man in der Implementierung eine globale Variable an, die eine Referenz auf die Controller-Instanz besitzt (Zuweisung kann nach der Initialisierung stattfinden, z.B. in awakeFromNib). Anschließend kann man global auf den Controller zugreifen. Hier ist natürlich auch Vorsicht geboten, dass niemand anderes da was überschreibt.

Hier ein Beispiel:
TestController.h
Code:
#import <Cocoa/Cocoa.h>

@interface TestController : NSObject {
    IBOutlet NSTextField *output;
}

@property (assign, readonly) IBOutlet NSTextField *output;

- (IBAction)pushButton:(id)sender;
@end

TestController.m
Code:
#import "TestController.h"

TestController *myGlobalController = nil;

void writeSomething() {
    [myGlobalController.output setStringValue:@"Button clicked! -> Text from C function"];
}

@implementation TestController

@synthesize output;

- (IBAction)pushButton:(id)sender {
    // call internal C function
    writeSomething();
}

- (void)awakeFromNib {
    myGlobalController = self;
}

@end
 
Super, hat funktioniert.

Kannst du mir bitte noch erklären, was awakeFromNib macht und wie es aufgerufen wird?
 
Dein Controller ist kein Singleton. Deshalb würde ich das nicht so machen.

Du kannst doch einen freien refCon übergeben, oder nicht? Dann nimm da halt den Instanzzeiger rein.