Wann können sie mit ESC Fenster schließen?

7

Also habe ich zufällig folgendes Verhalten bemerkt:

Einige Fenster können durch Drücken der escTaste geschlossen werden , z. B. das Einstellungsfenster in einer beliebigen App oder das Fenster "Safari-Hilfe" oder das Fenster "Schriftarten" in TextExit.

Andere Fenster können nicht durch Drücken der escTaste geschlossen werden , z. B. das Safari-Browserfenster oder das Fenster "Sonderzeichen".

Die Standardeinstellung cmd wscheint immer zu funktionieren.

Was ist die Regel für Tastenanschläge beim Schließen von Fenstern? Wann dürfen wir verwenden esc?

CousinCocaine
quelle
IMHO ist es wahrscheinlich eine Dev-Entscheidung, Esc an die Abschlussaktion zu binden.
Matthieu Riegler
1
@MatthieuRiegler Apple hat einige strenge Richtlinien für die Benutzeroberfläche. Ich hoffte, dass jemand weiß, ob diese Tastenkombination in den Richtlinien vermerkt ist, damit ich dieses Verhalten vorhersagen kann.
CousinCocaine
1
Apps, die dem einen oder anderen nicht gehorchen, sind schrecklich. Apps, die auch nicht gehorchen, sind schlimmer. Wörtlich wutauslösend.
Jason Salaz

Antworten:

8

Was Sie sehen, nämlich das Verhalten, bei dem die Escape-Taste das Fenster schließt, wird automatisch in die NSPanelKlasse integriert, die eine Unterklasse von ist NSWindow.

Von Window Programming Guide > How Panels Work:

Ein Panel ist eine spezielle Art von Fenster, das normalerweise eine Zusatzfunktion in einer Anwendung erfüllt. Die NSPanelUnterklasse von NSWindowfügt ein paar spezielle Verhaltensweisen zu Fenstern hinzu, um das Rollenbedienfeld zu unterstützen:

...

Wenn ein Panel das Schlüsselfenster ist und eine Schaltfläche zum Schließen hat, wird es automatisch geschlossen, wenn der Benutzer die EscapeTaste drückt .

Das Einstellungsfenster (oder Bedienfeld) ist in vielen Anwendungen wie folgt implementiert NSPanel: Safari, Vorschau, Terminal, Konsole. Das Bedienfeld „Schriftarten“ in Cocoa-Apps ist als implementiert NSPanel. Wenn Sie Safari> Safari-Hilfe wählen, wird eine unsichtbare Hintergrundanwendung, HelpViewer.app (/System/Library/CoreServices/HelpViewer.app), gestartet, deren Hauptfenster als Floating implementiert ist NSPanel. Aus diesen Gründen reagieren diese Bedienfelder auf die Escape-Taste, indem sie das Fenster schließen. Allgemeine Standardfenster, von denen es sich um Instanzen handelt NSWindow, zeigen dieses Verhalten nicht automatisch an, da nur Bedienfelder so funktionieren sollen.

NSGod
quelle
Danke für diese Antwort. Es macht jetzt Sinn. Dies erklärt auch, warum cmd-period im Hilfefenster von Safari nicht funktioniert. "Akzeptiert"
CousinCocaine
7

Das escSchließen eines modalen Dialogfelds mit der Taste entspricht in der Regel dem Drücken der Schaltfläche Abbrechen für das Dialogfeld. Dies ähnelt dem Drücken der Tasten Returnoder Enter, um die Aktion für die hervorgehobene Schaltfläche zu bestätigen.

Dies ist in den Apple Human Interface Guidelines für Macintosh von Anfang an enthalten und für OS X nicht neu. Die Richtlinie finden Sie hier unter der Überschrift "Dialoge schließen":

https://developer.apple.com/library/mac/documentation/userexperience/conceptual/applehiguidelines/Windows/Windows.html#//apple_ref/doc/uid/20000961-TPXREF56

Suchen Sie auf dieser Seite nach "escape". Die Übereinstimmung befindet sich ungefähr zu 3/4 auf der Seite und bezieht sich ausdrücklich auf dieses Verhalten.

Aus den Human Interface Guidelines:

Fügen Sie im Allgemeinen die Schaltfläche Abbrechen hinzu. Die Schaltfläche Abbrechen versetzt den Computer in den Zustand, in dem er sich vor dem Erscheinen des Dialogfelds befunden hatte. Es bedeutet "Ich habe es vergessen". Stellen Sie außerdem sicher, dass die Tastenkombination Befehlstaste und die Esc-Taste (Escape) der Abbrechen-Schaltfläche zugeordnet sind.

Ein weiteres nützliches Verhalten ist, wenn ein Dialog akzeptiert Returnoder EnterTeil eines Textfeldes ist, sehr oft drücken Command- Returnwird die Standardschaltfläche drücken.

Ɱark Ƭ
quelle
Dies ist die Antwort, nach der ich suche, aber ich bin noch nicht ganz zufrieden;) Mit <kbd> esc </ kbd> soll ein Modelldialog geschlossen werden, und in der Richtlinie wird auch angegeben, dass die Befehlsperiode dasselbe tun soll. Die Befehlsperiode funktioniert im Fenster "Schriftart" von TextEdit, jedoch nicht im Hilfefenster von Safari. Seltsam.
CousinCocaine
Wenn ich also das Schriftfenster als Dialog interpretiert habe, sollte das Fenster durch die Esc- oder Befehlsperiode geschlossen werden und mein Programm in den vorherigen Zustand zurückversetzt werden. Daher ist das Hilfefenster (im OP) kein Dialog. Aber warum funktioniert esc im Hilfefenster ... Aus den Richtlinien: "Die Schaltfläche Abbrechen versetzt den Computer in den Zustand, in dem er sich vor dem Erscheinen des Dialogfelds
befunden hatte
Dies sind nur Richtlinien. Der Entwickler kann diese ignorieren oder erweitern. In Apples eigenen Apps finden Sie zahlreiche Beispiele und Gegenbeispiele.
Ɱark Ƭ
2
Die Beispiele, die das OP angegeben hat, nämlich die meisten Einstellungsfenster in Apps, das Bedienfeld „Schriftarten“, das Hauptfenster von Help Viewer.app, sind nicht als modale Dialogfelder implementiert. Es handelt sich vielmehr um Instanzen von NSPanel, die automatisch das Verhalten "Escape-Taste bewirkt, dass das Bedienfeld geschlossen wird" erhalten.
NSGod