NSTextView: отставка первого респондента в приложении раскадровки

У меня есть приложение MacOS, использующее раскадровки (OSX 10.12; Xcode 9). Контроллер представления, который мне интересен, встроен в SplitViewController, который встроен в SplitViewController, который является основным ViewController's contentViewController, поэтому он находится на трех уровнях.

В этом контроллере представления у меня есть NSTextField ("title") и NSTextView ("body"). Что бы я ни делал, NSTextView является первым респондентом, и я хочу, чтобы мой NSTextField был первым элементом, в который вводит пользователь.

Я пытался использовать NSApplication.shared.mainWindow?.MakeFirstResponder (title) в ViewWillAppear (mainWindow по-прежнему равен нулю в ViewDidLoad; спасибо, Storyboard), но это никак не влияет: после вызова это тело остается первым респондентом.

Использование body.resignFirstResponder() или title.becomeFirstResponder() в равной степени не дает никакого эффекта (я знаю, что документация говорит: "Никогда не вызывайте этот метод напрямую", но его нужно было попробовать); курсор продолжает счастливо мигать в текстовом представлении.

Мне удалось создать хак с помощью создания подкласса NSTextView, первоначально возвращая false из 'acceptsFirstResponder' и устанавливая его обратно в 'true' в методе viewDidLoad моего ViewController, но это уродливо и просто обходит цепочку респондента.

Как правильно установить мой NSTextField в качестве первого респондента, когда NSTextView просто не хочет получать подсказку?

1 ответ

Реальная проблема со всеми моими попытками установить первый респондент состоит в том, что я не сделал абсолютно ничего плохого: NSApplication.shared.mainWindow?.MakeFirstResponder(title), вызываемый внутри ViewWillLoad, кажется, является именно тем методом, который необходим, который вызывается в нужное время.,

То есть, если окно не установлено на 'восстанавливаемый', который в Xcode 8/9 является настройкой по умолчанию. (Это меня несколько смущает. Документация гласит: "Если вы помечаете свои окна как восстанавливаемые, вы должны связать с ними класс восстановления."; Это не установлено по умолчанию, и это немного сложнее, чем кажется на первый взгляд. (См. https://www.raywenderlich.com/117471/state-restoration-tutorial для учебника по iOS; я посмотрю, насколько он применим к macOS).)

Одна из вещей, которая сохраняется между запусками, кроме положения и размера окна, - какой элемент интерфейса был активен при выходе из приложения; если для window.isRestorable задано значение false, initialFirstResponder работает так, как объявлено.

Это немного неудовлетворительный ответ, но он звучит как одна из этих проблем "предполагаемого поведения", поэтому мне, возможно, придется смириться с тем, что я совершенно не могу определить, какой текстовый элемент активен при запуске. (Я могу видеть варианты использования в любом случае, но восстановление окна имеет достаточно преимуществ, которые я, скорее всего, приму.)

Другие вопросы по тегам