2010-08-26 16 views
13

Ok hat, das ist wirklich ich stumping:NSApplication endsheet: keine Wirkung

ich ein modales Blatt auf einem Fenster als

erstellen
-(IBAction) login: (id) sender { 
[NSApp beginSheet:loginWindow 
    modalForWindow:window 
    modalDelegate:nil 
    didEndSelector:nil 
     contextInfo:nil]; 
} 

und versuche, es zu entfernen, mit

-(IBAction) loginWindowCancelPressed: (id) sender { 
debugLog(@"cancel"); 
[NSApp endSheet:loginWindow]; 
} 

aber es bleibt.

Ich habe alle offensichtlichen Dinge wie IB-Verbindungen überprüft und sichergestellt, dass Fenster und LoginWindow vorhanden sind und im normalen Zustand sind.

Also ist die Frage: Fehle ich etwas?

Antwort

19

Sie müssen einen Delegaten für das Blatt einrichten. Der Delegierte sollte ein Verfahren mit einer Signatur wie folgt implementieren:

- (void)didEndSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; 

(Sie einen anderen Namen verwenden können, wenn Sie mögen, aber es sollte die gleichen Parameter akzeptieren.)

Sie tun können, was Sie brauchen in dieser Methode zu tun, aber letztlich sollte es mit enden:

[sheet orderOut:self]; 

die das Blatt entlassen wird.

+0

Und so ist es. Vielen Dank! – tomwhipple

+2

Sie brauchen nicht wirklich einen Delegaten (es ist optional). Das einzige, was fehlt, ist der Aufruf von orderOut: – Nik

+1

Ich habe einen Delegaten und Selektor eingerichtet. Das Blatt wird von einer Fenstersteuerung gesteuert. EndSheet aufrufen: hat keine Wirkung (der Delegierte wird NIEMALS benachrichtigt). Der Aufruf von stopModal funktioniert, ist aber falsch und verursacht Probleme bei der Anzeige weiterer Blätter. WTF? Kakao für den Desktop ist wirklich eine große Sache. 90% der Zeit verbrachte mit diesen Idiosynkrasien umzugehen ... –

3

Siehe: Creating a Modal Dialog or Window in Cocoa Objective-c?

Ein Delegierter ist nicht erforderlich. Das folgende funktioniert für mich zu entlassen und ermöglicht es, es später wieder aufzurufen:

[NSApp endSheet: loginWindow]; 
[loginWindow orderOut:self]; 
+0

Für reine Einfachheit ist dies eine nützliche Lösung. Funktioniert auch mit dem neuen Storyboard-System für OSX. –

Verwandte Themen