2016-01-23 18 views
5

Как и в случае с this question, я пытаюсь установить первый ответчик на первый из трех NSTextField s в очень простом приложении. Рекомендации там (установить первый ответчик Window в построителе интерфейса), похоже, больше не применяются, по крайней мере, когда не используются раскадровки. Объект Window действительно имеет выход initialFirstResponder, но я не могу найти способ установить его с помощью drag, ctrl-drag и т. Д. В любом направлении в/из NSTextField.Настройка initialFirstResponder в приложении с раскадровкой OSX

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

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

Я отправил код до сих пор на GitHub

ответ

2

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()

Obj-C: [yourTextField becomeFirstresponder];

Надежда помогает!

Ade

редактировать

Я буквально побрился свой .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 (незадолго до появления на самом деле отображается), где вы помещаете startFirstResponder ..

Извините за ошибку!

+0

Yeh, вот почему я задавался вопросом, в какой момент жизненного цикла приложения можно было программно установить начальныйFirstResponder окна - я не в курсе жизненного цикла приложения, окна, вида и контроллера в мире раскадровки. Кроме того, это неправильный вызов. Из документов: «Используйте метод NSWindow makeFirstResponder:, а не этот метод, чтобы сделать объект первым ответчиком. Никогда не вызывайте этот метод напрямую». startFirstResponder - это метод, который можно реализовать, чтобы отказаться от первого запроса. Тем не менее, makeFirstResponder тоже не работает для меня! – Chris

+0

лично я либо вызываю его в init, либо в viewDidLoad :. В любом случае при условии, что элемент управления (NSTextField и т. Д.) Привязан к @IBOutlet правильно, вы можете легко вызвать self.whateverControl.becoemFirstRsponder() на этапе init() или viewDidLoad().Любой из них будет происходить до того, как наследующий наследник действительно вступит в силу. –

+0

makeFirstResponder возвращает NO для меня из viewDidLoad – Chris

Смежные вопросы