2010-08-26 27 views
13

Ok, questo è veramente mi stumping:NSApplication endSheet: non ha alcun effetto

ho creare un foglio modale su una finestra come

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

e cercare di rimuovere con

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

ma rimane.

Ho controllato tutte le cose ovvie come le connessioni IB e assicurando che finestra e loginWindow siano presenti e nello stato normale.

Quindi, la domanda è: mi manca qualcosa?

risposta

19

È necessario impostare un delegato per il foglio. Il delegato deve implementare un metodo con una firma simile al seguente:

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

(è possibile utilizzare un nome diverso, se volete, ma dovrebbe accettare gli stessi parametri.)

Si può fare tutto ciò che serve fare in quel metodo, ma alla fine dovrebbe finire con:

[sheet orderOut:self]; 

che chiuderà il foglio.

+0

E così è. Grazie! – tomwhipple

+2

In realtà non è necessario un delegato (è facoltativo). L'unica cosa che manca è la chiamata all'ordineOut: – Nik

+1

Ho impostato un delegato e un selettore. Il foglio è controllato da un controller finestra. Chiamare endSheet: non ha alcun effetto (il delegato non ha MAI notifica). Chiamare stopModal funziona, ma è sbagliato e causa problemi durante la visualizzazione di ulteriori fogli. WTF? Il cacao per il desktop fa davvero schifo. 90% del tempo trascorso a gestire queste idiosincrasie ... –

3

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

Un delegato non è necessaria. Il seguente funziona per me per chiudere e consente di richiamarlo più tardi:

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

Per pura semplicità, questa è una soluzione utile. Funziona anche con il nuovo sistema di storyboard per OSX. –

Problemi correlati