NSControl子类不应该更改firstResponder

时间:2012-05-22 18:07:57

标签: objective-c cocoa nswindow appkit nsresponder

我将tabbar视图实现为NSControl子类。

enter image description here

当我点击它时,AppKit会尝试更新我的NSWindow的firstResponder。由于我不希望标签栏变为firstResponderacceptsFirstResponder返回NO),因此NSWindow本身将成为firstResponder。我的响应者链将由窗口和它的控制器组成,并且没有动作消息被传递到标签栏下面的子视图(NSOutlineView)。我希望NSOutlineView在单击标签栏时继续接收操作消息和事件。

这样做的恰当方法是什么?是否无法阻止NSView在单击时尝试更改firstResponder

我考虑过将工具栏的nextResponder设置为NSOutlineView,但Apple不建议手动更改NSView的nextResponder

1 个答案:

答案 0 :(得分:0)

我最终在我的标签栏的委托方法实现中手动将firstResponder重置为大纲视图。

我提出的另一个解决方案是在标签栏中实现此功能,以便在标签栏变为firstResponder的情况下将firstResponder重置为原始对象。

- (void)awakeFromNib {
    [self.window addObserver:self
                  forKeyPath:@"firstResponder"
                     options:NSKeyValueObservingOptionOld
                     context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
                        change:(NSDictionary *)change context:(void *)context {
    NSResponder *oldResponder = [change objectForKey:NSKeyValueChangeOldKey];
    if (self.window.firstResponder == self) {
        [self.window makeFirstResponder:oldResponder];
    }
}