NSViewController中的firstResponder

lue*_*eda 5 cocoa objective-c

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

因此,除了设置为firstResponder的NSTextField之外,它几乎与Hillegass的书"Cocoa Programming for Mac OS X"(下载本书的示例)中的第29章相同.

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

小智 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]];
    }
}
Run Code Online (Sandbox Code Playgroud)

这假设ViewController公开了一个名为的getter方法-myTextField.

通过让视图控制器公开一个返回视图控制器建议作为第一个响应者的对象的方法,可以使这更通用.就像是:

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

@implementation ManagingViewController
…
- (NSResponder *)recommendedFirstResponder { return nil; }
@end
Run Code Online (Sandbox Code Playgroud)

并且,在您的具体子类中ManagingViewController,-recommendedFirstResponder返回应该是窗口的第一响应者的对象:

@implementation ViewController
…
- (NSResponder *)recommendedFirstResponder { return myTextField; }
@end
Run Code Online (Sandbox Code Playgroud)

完成后,您可以将您-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];
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*ard 1

你有没有尝试过[[myTextField window] makeFirstResponder:myTextField];