如何从 Cocoa 中的窗口控制器获取当前的第一响应者?

Posted

技术标签:

【中文标题】如何从 Cocoa 中的窗口控制器获取当前的第一响应者?【英文标题】:How to Get Current First Responder from Window Controller in Cocoa? 【发布时间】:2012-06-10 13:57:38 【问题描述】:

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

    @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' may not respond to 'isFirstResponder'”。

如何让 findFirstResponder 在 Cocoa 中工作?

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

-[NSWindow firstResponder] 返回一个 NSResponder。如何获得作为第一响应者的 NSView?然后我可以做if (firsResponderView == MyTableView),即测试一个视图是否是当前的第一响应者? 一个视图一个响应者——NSView继承自NSResponder。因此,您的 if 声明将起作用。一般情况可以if ([firstResponder isKindOfClass:[NSView class]]) NSView* firstResponderView = (NSView*)firstResponder; /* do something with firstResponderView */ .【参考方案2】:

如果您只想要第一响应者,请使用NSWindowfirstResponder 方法。

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

【讨论】:

我不认为这就是我所追求的。我想让“isFirstResponder”在该类别中工作。我并不是真的在寻找对用户点击的响应。我只提到了,因为当用户点击表格视图中的一个项目时,我假设它成为第一响应者。我想做的就是以编程方式找到第一响应者。我想知道他们是如何在这里做到的:***.com/questions/1823317/…

以上是关于如何从 Cocoa 中的窗口控制器获取当前的第一响应者?的主要内容,如果未能解决你的问题,请参考以下文章

如何将NSNib.Name传递给Swift / Cocoa中的窗口控制器

Cocoa Inspector - 如何在关闭最后一个文档后重置窗口标题

从Java中的进程获取打开的窗口数量

Cocoa Xcode:使用 Swift 4 for Mac 以编程方式从 AppDelegate 打开窗口控制器?

如何从 Cocoa 中的应用程序名称中获取 Bundle Identifier?

一个窗口中跨多个视图控制器的 Cocoa 绑定