如何从Cocoa中的Window Controller获取当前的第一响应者?

时间:2012-06-10 13:57:38

标签: cocoa nsview categories first-responder

我想在窗口中找到第一个响应者视图。为此,我想实现这样的类别:

    @implementation  NSView (ViewExtensions)
- (NSView *)findFirstResponder
{
    if ([self isFirstResponder]) {        
        return self;     
    }

    for (NSView *subView in [self subviews]) {
        NSView *firstResponder = [subView findFirstResponder];

        if (firstResponder != nil) {
            return firstResponder;
        }
    }

    return nil;
}

@end

以上代码基于SO:Get the current first responder without using a private API上的这个问题/答案。

问题可能是,NSResponder没有像UIResponder那样的isFirstResponder方法。 NSResponder的等价物是什么?

如果上面的方法如上所述,我当然得到调试消息:“'NSView'可能无法响应'isFirstResponder'”。

如何让findFirstResponder在Cocoa中运行?

更多信息:我后来想在窗口控制器中以某种方式使用上述方法:

        NSArray *copiedObjects;
        if ([[self window]contentView] == MyTableView) {
            copiedObjects = [tableController selectedObjects];
        }
        if ([[self window]contentView] == MyOutlineView) {
            copiedObjects = [treeController selectedFolders];
        }

2 个答案:

答案 0 :(得分:32)

-[NSWindow firstResponder]有什么问题,它会直接返回第一个响应者?

答案 1 :(得分:2)

如果您只想要第一个响应者,请使用firstResponder的{​​{1}}方法。

如果您想要针对特定​​操作的第一响应者(例如NSWindow

,您可能需要使用NSApplications targetForAction:方法