9

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

    @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];
        }
4

2 回答 2

32

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

于 2012-06-10T16:11:06.790 回答
2

如果您只想要第一响应者,请firstResponder使用NSWindow.

targetForAction:如果您想要特定操作的第一响应者(例如mouseDown:) ,您可能想要使用 NSApplications方法

于 2012-06-10T14:34:18.003 回答