NSTextField установить курсор

Итак, я чувствую, что в этом вопросе мне не хватает чего-то очевидного. Я использовал makeFirstResponder во всем своем коде для перехода от textField 1 к 2, 2 к 3 и т. д. Кажется, это работает так, как я хочу, но когда загружается новое представление, я хочу, чтобы курсор находился в textField1, и однако следующий код не помещает курсор в textField1 при загрузке.

- (void) awakeFromNib{
    [[[self view] window] makeFirstResponder:textField1];
}

Я также попробовал setInitialFirstResponder, и это тоже не дало никакого эффекта (я даже не думаю, что это было бы правильно). Итак, это потому, что он находится в методе awakeFromNib? Может ли кто-нибудь сказать мне, что мне не хватает? Заранее спасибо.

РЕДАКТИРОВАТЬ. Мое решение немного отличалось от принятого ответа, поэтому я решил опубликовать свою реализацию. Поскольку представление, для которого я хотел установить первого ответчика, было подпредставлением, добавленным позже (подумайте о втором экране мастера приложения), я просто добавил метод setCursorToFirstTextField:

- (void) setCursorToFirstTextField {
[[[self view] window] makeFirstResponder:textField1];
}

И обязательно вызвал его после того, как я добавил подвид к пользовательскому представлению в исходном окне.


person Katie    schedule 06.06.2012    source источник


Ответы (1)


Да, вы правы в том, что проблема заключается в расположении метода в awakeFromNib. Если вы зарегистрируете [окно self.view] в своем awakeFromNib, вы увидите, что оно равно NULL. Я не знаю, как именно у вас все настроено, но я предполагаю (если это относится к вашему вопросу WizardController), что вы делаете alloc initWithNibName:bundle: в другом классе, чтобы создать свой контроллер представления, а затем добавляете это представление контроллера в иерархию представлений. Если вы закинете туда какие-нибудь логи, то он покажет вам, что awakeFromNib в классе контроллера вызывается после инициализации alloc, но до того, как представление будет добавлено как подпредставление, поэтому окна в это время нет. Чтобы обойти эту проблему, я создал метод настройки в классе контроллера представления (с кодом makeFirstResponder в нем) и вызвал его из класса, в котором вы создаете контроллер, после добавления его в качестве подпредставления.

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.wizard = [[WizardController alloc] initWithNibName:@"WizardController" bundle:nil];
    [self.window.contentView addSubview:wizard.view];
    [self.wizard doSetup];
}
person rdelmar    schedule 07.06.2012
comment
Ваше объяснение определенно верно и было полезно для меня, однако, поскольку представление, для которого я хотел установить firstResponder, не является первым представлением окна моего приложения (подумайте о втором экране мастера), решение, которое я реализовал, было немного другим ( см. редактирование), но ваш ответ был чрезвычайно полезен. - person Katie; 07.06.2012