2012-04-06 4 views
0

Ich bin seit einer ganzen Weile darauf fest, und ich habe das Internet weit und breit für eine Lösung gesucht ... Die Verbindungen in IB sind richtig eingerichtet und ich kann Öffnen Sie mein NSWindow in watchFromNib wie folgt:NSWindow wird nicht in OSStatus Event-Handler-Methode angezeigt

ohne Probleme. Ich kann auch eine Methode von watchFromNib aufrufen und das Fenster mit denselben zwei Zeilen in der Methode öffnen.

Das Problem entsteht bei diesem Verfahren und in allen von ihm aufgerufenen Methoden - Die NSWindow wird nicht geöffnet:

OSStatus myHotKeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData) 
{ 
    GeronimoAppDelegate *self = [[GeronimoAppDelegate alloc] init]; 
    [self.popUp makeKeyAndOrderFront:nil]; 

    GeronimoAppDelegate *appDel = (GeronimoAppDelegate *)[NSApp delegate]; 
    [appDel.popUp makeKeyAndOrderFront:nil]; 

    //Run the timer method 
    [self runBackTimer]; 
    return noErr; 
} 

Wie Sie sehen können, habe ich zwei Ansätze versucht, das Fenster zu öffnen, um die durch Bezugnahme appdelegate, um auf das NSWindow-Objekt zuzugreifen, aber beide haben nicht funktioniert. Ich muss in der Lage sein, das Fenster von dieser Methode oder einer von ihr aufgerufenen Methode zu öffnen. Ich könnte mich auf das Objekt falsch beziehen? (Alle diese Methoden sind in der gleichen Datei - GeronimoAppDelegate.m)

Antwort

1

Die Hotkey-Handle-Funktion, die eine C-Funktion und nicht eine Objective-C-Instanzmethode ist, hat keine Vorstellung von einem "Selbst" -Objekt. Sie haben versucht, dies zu umgehen, indem Sie eine lokale Variable self deklarieren, aber es zeigt auf kein Objekt von Interesse. Stattdessen haben Sie ein neues und anderes Objekt erstellt, auf das es verweisen kann, das nicht mit den anderen Objekten in Ihrer App verbunden ist und dessen Eigenschaft popUp nicht mit irgendwas verbunden ist (weil es nicht von einem FEDER).

Bezug auf den App-Delegierten sollte gearbeitet haben. Sind Sie sicher, dass der Ausgang des Anwendungsobjekts delegate mit dem Anwendungsdelegatenobjekt verbunden ist, das in der NIB instanziiert wird? Könnten Sie später die Verbindung trennen oder erneut herstellen, indem Sie -setDelegate: anrufen oder seiner Eigenschaft .delegate zuweisen?

Um einen C-Style-Callback mit einem objektorientierten Programm zu integrieren, müssen Sie in der Regel einen Objektzeiger an die C-Funktion übergeben. Zum Glück bietet die Hotkey-Callback-Signatur ein solches Design mit dem Parameter userData. Wenn Sie den Rückruf registrieren, sollten Sie den Objektzeiger als Benutzerdaten angeben, die beim Aufruf an den Rückruf übergeben werden sollen. Im Callback deklarieren Sie eine Objektzeigervariable des entsprechenden Typs und weisen ihr userData zu (unter ARC erfordert dies eine __bridge-Umwandlung).

+0

Das war's! Ich hatte die Delegat-Steckdose des Anwendungsobjekts nicht mit dem App-Delegaten verbunden. Du bist ein Lebensretter! Danke vielmals. –

0

Die Tatsache, dass es in awakeFromNib öffnet, aber nicht an anderer Stelle darauf hinweist, dass es nicht tatsächlich verdrahtet ist, aber das Fenster ist beim Start "offen" markiert, so passiert es einfach arbeiten. Stellen Sie sicher, dass popUp nicht tatsächlich nil ist.

+0

"Sichtbar beim Start" ist deaktiviert, es ist mit dem NSWindow-Objekt "popUp" verbunden http://cl.ly/0N3p00323t2A0f0d2A1Q, und es wird nur in watchFromNib angezeigt, wenn ich es zum Öffnen mit "[popUp makeKeyAndOrderFront: nil] aufrufen " Daher sollte die Verbindung in Ordnung sein und sich außerhalb der OSStatus-Methode und allem, was von dieser Methode aufgerufen wird, wie erwartet verhalten. –