2012-06-06 178 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