如何从Cocoa中的窗口控制器获取当前的第一响应者?
我想在窗口中找到first responder视图。为此,我想实现如下类别:如何从Cocoa中的窗口控制器获取当前的第一响应者?,cocoa,nsview,categories,first-responder,Cocoa,Nsview,Categories,First Responder,我想在窗口中找到first responder视图。为此,我想实现如下类别: @implementation NSView (ViewExtensions) - (NSView *)findFirstResponder { if ([self isFirstResponder]) { return self; } for (NSView *subView in [self subviews]) { NS
@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
以上代码基于此问题/答案,因此:
问题可能在于nsrresponder不像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];
}
如果您只需要第一响应者,请使用
NSWindow
的firstResponder
方法
如果您希望某个特定操作的第一响应者(如
mouseDown:
)-[NSWindow firstResponder]
有什么问题,它直接返回第一响应者?我不认为这是我想要的。我想让“isFirstResponder”在这个类别中工作。我并不是在寻找对用户点击的响应。我只提到,因为当用户单击表视图中的某个项目时,我假设它会成为第一个响应者。我所要做的就是以编程方式查找第一响应者。我想知道他们是怎么做到的:-[NSWindow firstResponder]
返回一个nsrresponder。如何获取作为第一响应者的NSView?然后,如果(firsResponderView==MyTableView),我可以执行,即测试一个视图是否是当前的第一个响应程序?一个视图是否是响应程序–NSView
继承自nsrresponder
。因此,您的if
语句将正常工作。对于一般情况,如果([firstResponder isKindOfClass:[NSView class]]){NSView*firstResponderView=(NSView*)firstResponderView;/*使用firstResponderView*/}可以执行。