Als Neuling in Cocoa habe ich Schwierigkeiten zu verstehen, warum die generischen NSResponder-Unterklassen Schlüsselereignisse so implementieren, wie sie es zu tun scheinen.Warum behandelt eine NSWindow- oder NSView-Instanz ihre eigenen Schlüsselereignisse und nicht ihren Delegaten?
In meinem Programm habe ich eine NSWindow-Unterklasse, die den gesamten Bildschirm einnimmt und unbedingt Schlüsselereignisse behandeln muss. Es gibt mehrere Hauptbefehle, die den gesamten Status des Programms ändern können (z. B. einen Zeitgeber pausieren, wenn der Benutzer die Leertaste drückt), wobei es nicht sinnvoll ist, Teilansichten wie ein NSTextField-Handle zu haben.
Es scheint mir, dass der Delegat (Controller) diese Ereignisse erhalten soll. Stattdessen muss ich entweder einen Haufen unordentlichen Klebstoffcode schreiben, damit das Fenster (über seine keyDown:
und interpretKeyEvents:
Selektoren) den Controller benachrichtigt, oder ich muss einfach eine Menge Controller-Code in die NSWindow-Unterklasse selbst verschieben.
Das ist chaotisch und mein Bauchgefühl sagt mir, dass ich etwas vermisse. Gibt es eine sauberere Lösung?
Mein Delegat ist eigentlich eine NSWindowController-Unterklasse. Ich benutze den Interface Builder nicht, weil ich versuche, ein Fenster zu erstellen, das zum Zeitpunkt der Instanziierung grenzenlos sein kann, und IB scheint das nicht zuzulassen - außerdem versuche ich, die Details zu lernen und IB verbirgt sich sehr, also dachte ich mir, für diese App wäre es wert, "auf die harte Tour" zu lernen. Vielen Dank für den Link zu diesem Abschnitt der Dokumentation. Ich habe es gelesen, aber die Details über den NSWindowController als letzten Ausweg verpasst. Offensichtlich habe ich einen Fehler bei der Verwaltung der Responder-Kette gemacht. – EricB