好吧所以我觉得这个问题中有一些显而易见的东西。我在我的代码中使用了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];
}
在我将子视图添加到原始窗口的自定义视图后,请务必调用它。
答案 0 :(得分:1)
是的,你对awakeFromNib中方法位置的问题是正确的。如果您在awakeFromNib中记录[self.view窗口],您将看到它为NULL。我不知道你是如何设置的,但我猜测(如果这与你的WizardController问题有关)你正在做一个alloc initWithNibName:bundle:在另一个类中创建你的视图控制器然后添加控制器对视图层次结构的视图。如果你在那里抛出一些日志,它会告诉你在alloc init之后调用了控制器类中的awakeFromNib,但是在将视图添加为子视图之前,所以那时没有窗口。我解决这个问题的方法是在视图控制器类中创建一个setup方法(其中包含makeFirstResponder代码),并在将其添加为子视图后从创建控制器的类中调用它。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
self.wizard = [[WizardController alloc] initWithNibName:@"WizardController" bundle:nil];
[self.window.contentView addSubview:wizard.view];
[self.wizard doSetup];
}