Установка initialFirstResponder в раскадровке приложения OSX

Как и в этом вопросе, я пытаюсь установить первого ответчика на первый из трех NSTextField в очень простом приложении. Совет там (установить первого респондента Window в конструкторе интерфейса), похоже, больше не применяется, по крайней мере, когда задействованы раскадровки. Объект Window действительно имеет выход initialFirstResponder, но я не могу найти способ установить его с помощью перетаскивания, перетаскивания ctrl-drag и т. д. в любом направлении в/из NSTextField.

Структура, которую мне предоставил IB, включает сцену оконного контроллера (само по себе просто пустое окно), связанную со сценой контроллера представления (которая, в свою очередь, содержит мой набор NSTextField и меток).

Я подозреваю, что есть какое-то предположение/ассоциация по умолчанию, которую Xcode запекает в моем приложении, что заставляет контроллер Window автоматически загружать определенное представление во время выполнения, и поэтому невозможно связать первоначальный ответчик, о котором он не знает при сборке время. Что затем заставляет меня задаться вопросом, какой вызов жизненного цикла для какого объекта является правильной точкой для вызова self.view.window.initialFirstResponder = myTextField, пока не стало слишком поздно, и как наиболее правильно получить доступ к этому объекту. viewWillAppear или viewDidLoad в контроллере представления кажутся правильными, но ни один из них, похоже, не имеет надежного эффекта (первоначально активный NSTextField меняется от запуска к запуску, иногда появляется для отслеживания изменений кода, но в любом случае нет).

Я разместил код на GitHub.


person Chris    schedule 23.01.2016    source источник


Ответы (1)


initialFirstResponder применяется только тогда, когда NSWindow впервые появляется на экране. Согласно документам Xcode:

`NSWindow initialFirstResponder`
The view that’s made first responder (also called the key view) the first time the window is placed onscreen.

Если вы хотите установить что-то в качестве первого ответчика, вам нужно вызвать:

Свифт: yourTextField.becomeFirstresponder()

Объект-C: [yourTextField becomeFirstresponder];

Надеюсь поможет!

Аде

изменить

Я буквально сократил ваш домен .m до нескольких строк:

    #import "ViewController.h"

    @implementation ViewController

    #pragma mark - View lifecycle

    -(void)viewWillAppear{
        [super viewWillAppear];
        //[self.userTextField becomeFirstResponder];
        [self.pathTextField becomeFirstResponder];
    }

    #pragma mark - Connection actions

    - (IBAction)connectClicked:(id)sender {

    }

    - (IBAction)cancelClicked:(id)sender {
        // Tell the app delegate (once we've actually got a pointer to it) that we want to exit
    //    [self.delegate exitApplication];
    }



    @end

Моя вина! Извините, viewWillAppear (непосредственно перед тем, как представление действительно появится) — это то место, где вы помещаете beFirstResponder..

Приносим извинения за ошибку!

person Adrian Sluyters    schedule 23.01.2016
comment
Да, вот почему мне было интересно, в какой момент жизненного цикла приложения можно было программно установить InitialFirstResponder окна - я не в курсе жизненного цикла приложения, окна, представления и контроллера в мире раскадровки. Кроме того, это не правильный звонок. Из документов: используйте метод NSWindow makeFirstResponder:, а не этот метод, чтобы сделать объект первым ответчиком. Никогда не вызывайте этот метод напрямую. Тем не менее, makeFirstResponder у меня тоже не работает! - person Chris; 23.01.2016
comment
лично я либо вызываю его при инициализации, либо при просмотреDidLoad:. В любом случае, при условии, что элемент управления (NSTextField и т. д.) правильно привязан к @IBOutlet, вы можете легко вызвать self.whateverControl.becoemFirstRsponder() на этапе init() или этапе viewDidLoad(). Любой из которых произойти ПУТЬ до того, как закон о наследнике действительно вступит в силу. - person Adrian Sluyters; 23.01.2016
comment
makeFirstResponder возвращает NO для меня из viewDidLoad - person Chris; 23.01.2016
comment
В запросе viewDidLoad: myControl.refusesFirstResponder (логическое значение)... Это устанавливается в IB. Это примерно 2/3 пути вниз по инспектору атрибутов элемента управления... - person Adrian Sluyters; 23.01.2016
comment
перед запросом, если для него установлено значение false / NO, тогда [myControl setRefusesFirstResponder: NO]; или myControl.refusesFirstreponder = false - person Adrian Sluyters; 23.01.2016
comment
ОтказFirstResponder не отмечен в инспекторе IB для всех полей - person Chris; 23.01.2016
comment
Вы можете разместить его на Github и поделиться ссылкой? - person Adrian Sluyters; 23.01.2016
comment
Дайте нам знать :) Это, вероятно, одна из раздражающих особенностей, которые демонстрирует Xcode, собирая вещи в недоступных для поиска областях... :-/ - person Adrian Sluyters; 23.01.2016
comment
Давайте продолжим обсуждение в чате. - person Chris; 23.01.2016
comment
К сожалению, это не решение. becomeFirstResponder предназначен для того, чтобы спросить представление, хочет ли оно быть firstResponder (и, согласно документам, мы все равно не будем его вызывать), а не для установки его как firstResponder. По моему опыту, фактический firstResponder является полуслучайным. Он может выглядеть правильно и может не меняться в течение нескольких прогонов/сборок, но очистка и перестроение, вероятно, вызовут его изменение (даже без изменения кода). - person Chris; 24.01.2016
comment
документы: используйте NSWindow makeFirstResponder:, а не этот метод, чтобы сделать объект первым ответчиком. Никогда не вызывайте этот метод напрямую. - person Dimitar Nestorov; 06.04.2020