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

A A*_*A A 9 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
Run Code Online (Sandbox Code Playgroud)

上面的代码基于SO上的这个问题/答案:在不使用私有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];
        }
Run Code Online (Sandbox Code Playgroud)

Ken*_*ses 32

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

  • 视图**是一个响应者 - "NSView"继承自"NSResponder".所以,你的`if`语句就可以了.对于一般情况,你可以做`if([firstResponder isKindOfClass:[NSView class]]){NSView*firstResponderView =(NSView*)firstResponder;/*用firstResponderView*/}做一些事情. (10认同)