2012-06-06 134 views
1

好吧,所以我觉得在这个问题中有些东西显而易见。我在整个代码中使用了makeFirstResponder,从textField 1移动到了2,2到3等。这似乎按照我的意图工作,但是当新视图加载时,我希望光标位于textField1中,并且但下面的代码在加载时不会将光标置于textField1中。NSTextField设置光标

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

我也试过setInitialFirstResponder,并且没有任何效力,要么(我甚至不认为这是正确的。)那么,是不是因为它是在awakeFromNib方法?任何人都可以告诉我我错过了什么吗?提前致谢。

编辑 - 我的解决方案与公认的答案略有不同,所以我想我会发布我的实施。因为观点我想设置第一个响应者是后来加了子视图(想想一个应用程序向导的第二个屏幕),我只是增加了一个setCursorToFirstTextField方法:

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

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

回答

1

是的,你是正确的问题是方法在awakeFromNib中的位置。如果你在你的awakeFromNib中记录[self.view窗口],你会发现它是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]; 
} 
+0

你的解释是绝对正确的,是对我很有帮助,但是因为我想设置firstResponder的观点是不是我的应用程序窗口的第一个视图(想想在向导的第二个屏幕),该解决方案我执行的内容稍有不同(请参阅编辑),但您的回答非常有帮助。 – Katie