2012-04-06 5 views
2

So lassen Sie uns sagen, dass ich eine Methode wie diese haben, die, wenn document zu überprüfen verwendet wird modifiziert worden ist, bevor es tatsächlich endet:Anzeige Ja-Nein NSAlert modal und bekommen Wert innerhalb der gleichen Methode

- (BOOL) canCloseDocument:(id)document 
{ 
    if ([document modified]) 
    CONFIRM_ALERT(@"Close Document", 
         @"Are you sure you want to close this document?", 
         [[core browser] window], 
         @selector(confirm:code:context:), 
         nil); 
    else 
      return YES; 
} 

In diesem Fall wird die confirm:code:context: Methode aufgerufen und NOTHING wird von canCloseDocument zurückgegeben.

Hier ist meine CONFIRM_ALERT Definition:

#define CONFIRM_ALERT(X,Y,Z,W,V) \ 
NSAlert* confirmAlert = [NSAlert alertWithMessageText:X \ 
defaultButton:@"OK" \ 
alternateButton:@"Cancel" \ 
otherButton:nil \ 
informativeTextWithFormat:Y]; \ 
[confirmAlert beginSheetModalForWindow:Z \ 
modalDelegate:self \ 
didEndSelector:W \ 
contextInfo:V]; 

Frage:

Wie könnte ich es tun, so dass das Alert-Blatt angezeigt wird, und der Wert (OK gedrückt Abbrechen gedrückt?) wird innerhalb der gleichen Methode (canCloseDocument:) abgerufen, so dass entweder YES oder NO?

Antwort

1

Blätter sind window-modal, nicht anwendungsmodal. Das bedeutet, dass sie nicht so funktionieren, wie du es erhofft hast. Das Blatt wird angezeigt, aber der Ausführungsablauf muss zur Hauptereignisschleife zurückkehren, damit der Benutzer in anderen Fenstern der App weiterarbeiten kann.

Wenn Sie eine Antwort wünschen, bevor Sie zurückkehren, müssen Sie eine modale Warnung verwenden. Erstellen Sie die Warnung, und rufen Sie dann -runModal anstelle von -beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo: darauf auf.

Dies verhindert jedoch, dass der Benutzer etwas anderes mit Ihrer App tun kann, bis sie die modale Warnung verwerfen. Beachten Sie, dass dies nicht nur in einer modalen Warnung inhärent ist, sondern in Ihrem Wunsch nach -canCloseDocument:, dass Sie nicht zurückkehren, bis eine Antwort vorliegt. Das bedeutet, dass der Ausführungsablauf nicht an die Hauptereignisschleife zurückgegeben wird, was die Interaktion mit Ihrer App ermöglicht.

+0

Ich habe 'runModal:' aber es wird nicht als ein Blatt angezeigt ... so wie mache ich das? Wie macht es NSOpenPanel? (Es ist genau dasselbe, nicht wahr?) –

+0

Was ich auszudrücken versuchte ist, dass du * entweder * modal * sein kannst * oder * du kannst ein Blatt benutzen, aber du kannst nicht beides. Blätter sind von Natur aus nicht modal. (Wir sprechen davon, dass sie window-modal sind, aber das ist nicht modal in dem Sinne, wie Sie wollen, wo sie synchron im Verlauf eines einzelnen Methodenaufrufs verarbeitet werden können.) NSOpenPanel macht auch nicht die Art von Sache, die Sie wollen. –