2017-06-24 3 views
0

Ich habe eine Mac OS App mit Storyboards (OS X 10.12; Xcode 9). Der View-Controller, an dem ich interessiert bin, ist in einen SplitViewController eingebettet, der in einen SplitViewController eingebettet ist, der der contentViewController des ViewControllers ist, also drei Ebenen tief sitzt.NSTextView: Resign First Responder in Storyboard-App

In diesem View-Controller habe ich ein NSTextField ("title") und ein NSTextView ("body"). Was auch immer ich mache, das NSTextView ist der Ersthelfer, und ich möchte, dass mein NSTextField das erste Element ist, in das der Benutzer eingibt.

Ich habe versucht, NSApplication.shared.mainWindow mit .makeFirstResponder (Titel) in ViewWillAppear (Mainwindow ist immer noch nil in ViewDidLoad, danke, Storyboard), aber es hat keinerlei Auswirkungen: nach diesem Aufruf Körper bleibt der Ersthelfer .

Die Verwendung von body.resignFirstResponder() oder title.becomeFirstResponder() hat ebenfalls keine Auswirkungen (Ich weiß, dass in der Dokumentation steht "Niemals diese Methode direkt aufrufen", aber es musste versucht werden); Der Cursor blinkt weiterhin fröhlich in der Textansicht.

Ich habe es geschafft, einen Hack durch Unterklassenbildung von NSTextView zu erstellen, wobei ich zunächst 'false' von 'acceptsFirstResponder' zurückgab und in der viewDidLoad-Methode von ViewController auf 'true' zurückstelle, aber das ist hässlich und umgeht einfach die Responderkette.

Wie kann ich mein NSTextField als Ersthelfer richtig einstellen, wenn der NSTextView den Hinweis einfach nicht übernehmen will?

+0

Liegt das NSTextField über dem NSTextView? Machst du ihnen etwas, setze den Inhalt, eine Bindung oder etwas? Haben Sie versucht, 'initialFirstResponder' des Fensters zu setzen? – Willeke

+0

Das TextField befindet sich oberhalb und links neben dem TextView, dies macht keinen Unterschied. Ich setze den Inhalt in ViewDidLoad; Ich habe gerade die Reihenfolge umgekehrt, aber das macht keinen Unterschied. InitialFirstResponder ist ein interessanter - ich hatte davon nichts gewusst. Ich habe es in ViewWillAppear (das scheint der erste Ort zu sein, auf den ich das Fenster zugreifen kann), und während es mir in der Konsole sagen wird, dass mein TextField der erste Ersthelfer ist, blinkt der Cursor glücklich in der Textansicht. –

+0

Ich kann dein Problem nicht reproduzieren, es muss etwas sein, das du irgendwo irgendwie machst. – Willeke

Antwort

0

Das eigentliche Problem mit all meinen Versuchen, den ersten Responder zu setzen, ist, dass ich absolut nichts falsch gemacht habe: NSApplication.shared.mainWindow? .makeFirstResponder (title) genannt in ViewWillLoad scheint genau die Methode zu sein, die at aufgerufen wird genau die richtige Zeit.

Das heißt, es sei denn, das Fenster ist auf 'wiederherstellbar' eingestellt, was in Xcode 8/9 die Standardeinstellung ist. (Das verwirrt mich etwas. Die Dokumentation sagt "Wenn Sie Ihre Fenster als wiederherstellbar markieren, müssen Sie ihnen eine Wiederherstellungsklasse zuordnen."; Dies ist nicht standardmäßig eingestellt, und es ist ein wenig komplizierter als es zunächst klingt. (Siehe https://www.raywenderlich.com/117471/state-restoration-tutorial für ein iOS-Tutorial,. ich werde sehen, wie viel davon zu macOS gilt))

eines der Dinge, dass tut zwischen Starts erhalten haltbar gemacht, andere als Fensterposition und Größe, ist das Interface-Element war aktiv, wenn Sie beenden die Anwendung; Wenn window.isRestorable auf false gesetzt ist, funktioniert initialFirstResponder wie angekündigt.

Dies ist eine etwas unbefriedigende Antwort, aber es klingt wie eines dieser "beabsichtigten Verhaltens" -Probleme, so dass ich vielleicht damit leben muss, dass ich überhaupt nicht feststellen kann, welches Textelement beim Start aktiv ist. (Ich kann Anwendungsfälle auf jeden Fall sehen, aber die Fensterwiederherstellung hat genügend Vorteile, dass ich sie wahrscheinlich übernehmen werde.)

Verwandte Themen