2011-03-10 74 views
5

我有兩個類。 ManagingViewController是NSViewController的子類,ViewController是管理視圖控制器的子類。在Viewcontroller中,我有一個NSTextField,我想成爲第一個響應者,但我沒有管理它。NSViewController中的firstResponder

因此,它與Hillegass的Mac OS X可編程書籍(Download of the book's examples)中的第29章幾乎相同,只是NSTextField被設置爲firstResponder。

任何人都可以指出我正確的方式嗎?

+0

您可以發佈您正在使用的代碼嗎? – Tim 2011-03-10 22:50:04

+0

看看這本書的例子(29_ViewSwapping)。只添加'IBOutlet NSTextField *測試;'和'IBOutlet NSTextField * test2;'到DepartmentViewController.h和兩個NSTextFields到DepartmentView.nib – lueda 2011-03-11 10:22:22

+0

像我說的...使用界面生成器。你可以輕鬆設置哪一個 – 2011-05-04 11:04:48

回答

1

你試過[[myTextField window] makeFirstResponder:myTextField];

+0

剛在'-awakeFromNib'中試過這個,但它對我不起作用。第一個響應者仍然是錯誤的字段。 – lueda 2011-03-11 10:23:27

+0

您嘗試在筆尖設置'initialFirstResponder'? – Richard 2011-03-11 15:05:37

+1

自定義視圖沒有initialFirstResponder。只有一個窗口,所以我想我必須從NSViewController內部調用窗口(就像你的第一個建議)。但我不知道如何。 – lueda 2011-03-11 15:20:32

-3

簡單。轉到界面生成器中的xib文件。右鍵單擊第一個響應者字段。它會顯示連接,刪除連接並將其連接到所需的響應者。讓我知道這是否工作

+0

看看上面的答案的評論! – lueda 2011-05-03 15:33:06

+0

至少對於osx不起作用。 – Borzh 2015-07-17 18:23:56

6

您需要設置文本字段作爲第一響應者通過使用-[NSWindow makeFirstResponder:]

由於這是一個NSWindow方法,只有在向窗口添加相應的視圖後,即在將視圖添加爲窗口視圖層次結構內的子視圖之後,纔有意義。在本書的示例中,當您將視圖設置爲窗口內框的內容視圖時,會發生這種情況。例如:

- (void)displayViewController:(ManagingViewController *vc) { 
    // Try to end editing 
    NSWindow *w = [box window]; 
    … 

    // Put the view in the box 
    NSView *v = [vc view]; 
    [box setContentView:v]; 

    // Set the first responder 
    if ([vc class] == [ViewController class]) { 
     [w makeFirstResponder:[(ViewController *)vc myTextField]]; 
    } 
} 

這假定ViewController暴露稱爲-myTextField的吸氣劑的方法。

通過讓視圖控制器公開一個返回視圖控制器建議作爲第一響應者的對象的方法,可以使其更通用。喜歡的東西:

@interface ManagingViewController : NSViewController 
… 
- (NSResponder *)recommendedFirstResponder; 
@end 

@implementation ManagingViewController 
… 
- (NSResponder *)recommendedFirstResponder { return nil; } 
@end 

而且,在你的ManagingViewController具體子類,具有-recommendedFirstResponder回報的對象,應該是窗口的第一個響應者:

@implementation ViewController 
… 
- (NSResponder *)recommendedFirstResponder { return myTextField; } 
@end 

已經這樣做了,你可以改變你-displayViewController:的東西如:

- (void)displayViewController:(ManagingViewController *vc) { 
    // Try to end editing 
    NSWindow *w = [box window]; 
    … 

    // Put the view in the box 
    NSView *v = [vc view]; 
    [box setContentView:v]; 

    // Set the first responder 
    NSResponder *recommendedResponder = [vc recommendedFirstResponder]; 
    if (recommendedResponder) [w makeFirstResponder:recommendedResponder]; 
} 
+0

這就是我正在尋找的東西。在我的NSViewController中實現它,並且它可以工作。 但是,我做了@optional,因爲並非所有的觀點都在意讓一個領域成爲第一響應者。 – SilverSideDown 2012-10-08 14:39:39