• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> 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:mad:"Signal war da"]; //textfeld undeclared
}
>

Wüßte mir da eventuell jemand Rat?


netten Gruß
Benji
 

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
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
 

BenjiBenji

Alkmene
Registriert
11.03.09
Beiträge
32
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
 

Scotch

Bittenfelder Apfel
Registriert
02.12.08
Beiträge
8.059
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
 

Pennywise81

Jonagold
Registriert
23.07.09
Beiträge
21
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
 

BenjiBenji

Alkmene
Registriert
11.03.09
Beiträge
32
Super, hat funktioniert.

Kannst du mir bitte noch erklären, was awakeFromNib macht und wie es aufgerufen wird?
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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.