繁体   English   中英

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

[英]Where does my First Responder Chain start?

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

因此,我要使用“第一响应者”。 我添加了菜单项,定义了一个动作删除:在“第一响应者”中,并将菜单项链接到该动作。 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]; }];

但是我的方法删除:不会被调用! 当用户单击表格视图时,它成为“第一响应者”吗? 然后,ViewController应该会收到该动作。 否则,什么是第一响应者以及如何设置它? 我想我缺少了什么!

原因不起作用

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;

我找到了解决此问题的方法。 当我在“第一响应者”中定义动作时,我只是忘记在其动作中添加分号。

因此,我输入“ delete”而不是“ delete:”,正是由于这个原因,未调用我的方法-(void)delete:(id)sender!

还是要谢谢你的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM