我的第一响应者链从哪里开始?

Posted

技术标签:

【中文标题】我的第一响应者链从哪里开始?【英文标题】:Where does my First Responder Chain start? 【发布时间】:2014-07-12 18:38:12 【问题描述】:

我正处于设计应用程序的最后一步。 它基本上由两个表视图和其他视图组成。每个 TableView 都有自己的 TableViewController 类实例。 我想做的是在用户单击表格视图行之一时激活相应的菜单项。比如我想删除用户当前选择的文件,所以激活了文件菜单保存。但是如果他不在表格视图中,我想在菜单中将其变灰。

因此,我想使用 First Responder。我添加了菜单项,在 First Responder 中定义了一个动作删除:并将菜单项链接到该动作。 TableViewController 是 NSViewController 的子类。在 TableViewController.m 中,我编写了 init 方法(将视图控制器插入到响应者的链中):

    [self setView:_tableView];
    [self setNextResponder:self.view];
    [self.view.subviews enumerateObjectsUsingBlock:^(NSView *subview, NSUInteger idx, BOOL *stop)  [subview setNextResponder:self]; ];

但是我的方法 delete: 没有被调用!当用户单击 tableview 时,它成为 First Responder 对吗?然后 ViewController 应该接收到动作。 否则,什么是 First Responder 以及如何设置? 我想我错过了什么!

【问题讨论】:

【参考方案1】:

它不起作用的原因

firstResponder 是响应选择器的第一个视图、窗口或应用程序本身

基本上

id firstResponder = keyView;
while(![firstResponder respondsToSelector:yourSelector] && firstResponder != nil) 
    firstResponder = firstResponder.superview;


if(!firstResponder && [keyView.window respondsToSelector:sel]) 
    firstResponder = window;


if(!firstResponder && [application respondsToSelector:sel]) 
    firstResponder = application;

ViewController 不在响应者链中,永远不会得到选择器

见https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html

解决方案

将 VC 添加到响应者链中

id resp = myTableView.nextResponder;
myViewController.nextResponder = resp;
tableView.nextResponder = myViewController;

【讨论】:

感谢您的回答。我知道我必须将我的 ViewController 包含在我的响应者链中。我认为我的问题是:1)我不明白如何设置第一响应者。 2)当用户单击第一个表视图并按下删除键时,我想从 MyTableView 类中调用函数删除,当他单击大纲视图时,我想调用我将从此类中实现的删除方法。我该怎么做? 也许重读我的帖子。你不要设置第一响应者。它是由 OS X 通过沿着响应者链确定的——我还向您展示了如何集成您的控制器。 :) 好的,让我重新表述一下,很难解释我不明白的内容。当我点击一个视图时,这个视图会成为第一响应者吗?如果是,我不明白,因为即使我实现了一个方法删除:在我的视图类中,我将菜单项删除链接到第一个响应者中的删除:方法,然后我运行我的应用程序,我点击我的视图和删除菜单项目仍然是灰色的。为什么?我错过了什么吗?【参考方案2】:

我找到了解决这个问题的方法。当我在 First Responder 中定义操作时,我只是忘记在操作中添加分号。

所以我输入了“delete”而不是“delete:”,正因为如此,我的方法 -(void)delete:(id)sender 没有被调用!

感谢您的帮助!

【讨论】:

以上是关于我的第一响应者链从哪里开始?的主要内容,如果未能解决你的问题,请参考以下文章

我的第一个 Prime Faces 响应项目 [重复]

:多点触摸与手势检测

如何处理 NSTextField 子类的第一响应者状态?

在数据重新加载期间保持自定义 UICollectionViewLayout 中视图的第一响应者状态

UITextField 没有成为集合视图中的第一响应者

如何将动作从 NSToolbar 项发送到 TabViews 的第一响应者