1

我必须升级一个现有的应用程序,并且需要将其现有的 UI 拆分为单独的 NIB。我计划从为所有拆分的 UI 创建单独的 NIB 和 NSViewController 开始。现在的问题是我的 NSViewController 没有响应键盘 TAB 和 SHFIT+TAB 事件,我只是希望我的 NSViewController 在用户单击 TAB 或 SHIFT+TAB 时在动态加载的 NSViewController 视图中将焦点设置在适当的子控件上。

谢谢,

编辑:以下是我的要求。

我有三个子视图,我需要在我的 MainWindow 占位符 NSBox 中动态加载并使用 NSPopupButton 进行切换。

为了检查,我创建了新的可可应用程序并将一个 NSPopupButton 和 NSBox 添加到 Window 并加入 NSPopupButton 和 NSBox 的出口。

其次,我创建了三个新的 NSViewController,其中三个不同的 NIB 包含单独的自定义视图,其中包含两个或三个 NSTextField 的子控件。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
}

在主应用程序委托函数中,我将所有三个 NSViewController 添加到一个数组中,然后使用 replaceSubview 交换视图以替换占位符 NSBox 中的视图。

我在所有三个 NSViewController 中添加了以下代码,但我仍然没有通过按 TAB 或 SHIFT+tab 键来关注子控件。

- (void)loadView {
    [super loadView];

    // store the responder that’s right after the view in the responder chain
    NSResponder *nextResponder = [[self view] nextResponder];

    // set the view controller (self) as the next responder after the view
    [[self view] setNextResponder:self];

    // set the stored responder as the next responder after the view controller
    [self setNextResponder:nextResponder];
}
4

1 回答 1

2

即使NSViewController继承自NSResponder,Cocoa 也不会自动将NSViewController实例添加到响应者链中。你需要自己做。

一种可能的解决方案是将您的视图控制器插入到它所控制的视图和该视图的下一个响应者之间的响应者链中。例如,在您的视图控制器实现中,

- (void)loadView {
    [super loadView];

    // store the responder that’s right after the view in the responder chain
    NSResponder *nextResponder = [[self view] nextResponder];

    // set the view controller (self) as the next responder after the view
    [[self view] setNextResponder:self];

    // set the stored responder as the next responder after the view controller
    [self setNextResponder:nextResponder];
}
于 2011-02-16T07:32:09.787 回答