NSViewController中的firstResponder

时间:2011-03-10 22:21:29

标签: objective-c cocoa

我有两节课。 ManagingViewController,NSViewController的子类,以及ViewController,一个子类auf ManagingViewController。在Viewcontroller中,我有一个NSTextField,我想成为第一个响应者,但我没有管理它。

所以它几乎与Hillegass的书“Cocoa Programming for Mac OS X”(Download of the book's examples)中的第29章相同,除了设置为firstResponder的NSTextField。

有人能指出我正确的方法吗?

3 个答案:

答案 0 :(得分: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的getter方法。

通过让视图控制器公开一个返回视图控制器建议作为第一个响应者的对象的方法,可以使其更通用。类似的东西:

@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];
}

答案 1 :(得分:1)

您是否尝试过[[myTextField window] makeFirstResponder:myTextField];

答案 2 :(得分:-3)

简单。转到界面构建器中的xib文件。右键单击第一个响应者字段。它将显示连接,删除连接并将其连接到所需的响应程序。让我知道这是否有效