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

时间:2014-07-12 18:38:12

标签: objective-c first-responder nsviewcontroller

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

因此,我想使用First Responder。我添加了菜单项,在First Responder中定义了一个动作delete:并将菜单项链接到该动作。 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]; }];

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

2 个答案:

答案 0 :(得分:0)

它没有工作的原因

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;
}

ViewControllers不在响应者链中,永远不会获得选择器

请参阅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;

答案 1 :(得分:-1)

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

所以我输入了"删除"而不是"删除:"正因为这个原因,我的方法 - (void)删除:( id)发送者没有被调用!

无论如何,谢谢你的帮助!