• Wieder einmal haben uns unsere Apfeltalker tolle Fotos zur Abstimmung eingesandt. Welches ist Euer Favorit? Stimmt mit ab! Hier geht es zur Abstimmung --> Klick
  • Es ist bereits Apfeltalk-Tradition und wir möchten sie auch in diesem Jahr fortsetzen: Unser Apfeltalk-Weihnachtslogo-Wettbewerb hat begonnen! Gestaltet für uns das Weihnachtsbanner, das im Monat Dezember bis zum Weihnachtsfest unsere Webseite schmücken soll. Lasst Eurer Kreativität freien Lauf! Hier geht es zum Wettbewerb --> Klick

Modalität von NSWindow steuern

  • Ersteller Ersteller Mitglied 7974
  • Erstellt am Erstellt am

Mitglied 7974

Gast
Hallo, zusammen!

Ich bekomm mal wieder was nicht gebacken. Dieses Mal ist mir nicht klar, wie das mit der Fenstermodalität funktionieren soll. Letzten Endes will ich einfach nur erreichen, dass ein bestimmter Dialog applikationsweit modal angezeigt wird, diese Modalität beim Schließen des Fensters (sei es durch den regulären Close-Button links oben in der Titelleiste oder durch Okay- und Abbrechen-Button) aber wieder aufgehoben wird.

Laut Dokumentation geht das ja auch ganz einfach: Es gibt die Methode NSApp#runModalForWindow:, die sich darum kümmert. Was ich also aktuell tue, ist, dass ich die Methode showWindow: meines NSWindowControllers für den Dialog überschreibe.

Code:
- (void)showWindow:(id)sender {
    [super showWindow:sender];
    [NSApp runModalForWindow:[super window]];
}
Das klappt dann auch und der Dialog wird modal angezeigt. Wenn ich ihn nun aber mit dem Close-Button in der Titelleiste schließe, wird die Modalität freilich nicht aufgehoben, weil ich hierfür irgendwo noch NSApp#stopModal aufrufen müsste.

Die Frage ist halt nur: Wo muss ich stopModal aufrufen? Von Java her kommend ging ich jetzt davon aus, dass ich entweder im NSWindowController oder im NSWindow direkt irgendwo ein Close-Event oder dergleichen abfangen könnte und dort dann einfach stopModal aufrufe. Es gibt zwar die Methode close, aber die scheint hier nicht der richtige Ansatzpunkt zu sein.

Daher wäre ich froh, wenn ihr mir das Vorgehen erklären könntet, wie man die Modalität eines NSWindow applikationsweit korrekt aktiviert und wieder deaktiviert.

Vielen Dank!
 
Die Frage ist halt nur: Wo muss ich stopModal aufrufen? Von Java her kommend ging ich jetzt davon aus, dass ich entweder im NSWindowController oder im NSWindow direkt irgendwo ein Close-Event oder dergleichen abfangen könnte und dort dann einfach stopModal aufrufe. Es gibt zwar die Methode close, aber die scheint hier nicht der richtige Ansatzpunkt zu sein.
Richtig, die close Methode ist der falsche Ansatz. Es ist auch schon der falsche Ansatz, den Close-Button des Fensters für einen modalen Dialog überhaupt anzuzeigen. Das ist nicht im Sinne der Apple Human Interface Guidelines ("Alerts and modal dialogs do not display any of these buttons."). Modale Dialoge sollen nur über Buttons im Dialog selbst verlassen werden. Das stopModal rufst Du dann in der entsprechenden Action-Methode auf.

MacApple
 
Hallo, MacApple!

Danke für deine Antwort, welche ich für sehr aufschlussreich halte. Dann wird's neben dem Umstand, mich in Cocoa noch genauer einarbeiten zu müssen, auch Zeit, die Interface Guidelines zu lesen. Zumindest bestätigt mir das auch den Verdacht, dass mein Fall im Framework gar nicht vorgesehen ist.

Vielen Dank nochmal!