1

好的,所以我觉得在这个问题中我明显遗漏了一些东西。我在整个代码中使用 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];
}

并确保在我将子视图添加到原始窗口的自定义视图后调用它。

4

1 回答 1

1

是的,你说得对,问题是 awakeFromNib 中方法的位置。如果您在 awakeFromNib 中记录 [self.view window],您会看到它为 NULL。我不知道您到底是如何设置的,但我猜(如果这与您的 WizardController 问题有关)您正在另一个类中执行 alloc initWithNibName:bundle: 来创建您的视图控制器,然后添加它控制器的视图到视图层次结构。如果你在那里扔一些日志,它会告诉你控制器类中的 awakeFromNib 在 alloc init 之后被调用,但在视图被添加为子视图之前,所以当时没有窗口。我解决这个问题的方法是在视图控制器类中创建一个设置方法(其中包含 makeFirstResponder 代码),

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.wizard = [[WizardController alloc] initWithNibName:@"WizardController" bundle:nil];
    [self.window.contentView addSubview:wizard.view];
    [self.wizard doSetup];
}
于 2012-06-07T03:40:08.447 回答