如何从 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】:
如果您只想要第一响应者,请使用NSWindow
的firstResponder
方法。
如果您希望特定操作的第一响应者(例如mouseDown:
),您可能需要使用 NSApplications targetForAction:
方法
【讨论】:
我不认为这就是我所追求的。我想让“isFirstResponder”在该类别中工作。我并不是真的在寻找对用户点击的响应。我只提到了,因为当用户点击表格视图中的一个项目时,我假设它成为第一响应者。我想做的就是以编程方式找到第一响应者。我想知道他们是如何在这里做到的:***.com/questions/1823317/…以上是关于如何从 Cocoa 中的窗口控制器获取当前的第一响应者?的主要内容,如果未能解决你的问题,请参考以下文章
如何将NSNib.Name传递给Swift / Cocoa中的窗口控制器
Cocoa Inspector - 如何在关闭最后一个文档后重置窗口标题
Cocoa Xcode:使用 Swift 4 for Mac 以编程方式从 AppDelegate 打开窗口控制器?