今天我发现一件奇怪的事情,似乎我的UIView
可以自动获得对UIViewController
的引用
我的UIView
声明了一个控制器属性:
@interface YLSFirstView : UIView
@property YLSFirstViewController *controller;
@end
在.m文件中,我将该控制器设置为按钮目标:
[button addTarget:self.controller action:@selector(testAction) forControlEvents:UIControlEventTouchUpInside];
当然,在controller .m文件中,我实现了该操作(testAction
)
以下是代码实例并初始化UIView
和UIController
,但我从未设置控制器@property
!
YLSFirstViewController *first = [[YLSFirstViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
first.view = [[YLSFirstView alloc] initWithFrame:CGRectNull];
让我感到惊讶的是:当我点按该按钮时,testAction
中的操作“ViewController
”会被调用...
我对此很困惑,为什么@property
中的UIView
控制器得到了正确的引用? iOS
中是否有一些潜规则?
PS:顺便说一句,有几次(不太经常),按钮失去响应,当我点击它时,什么都没发生。在大多数时候,它只是运作良好。我不知道是否有与上述内容有关的内容。
你能告诉我答案吗?非常感谢答案 0 :(得分:5)
不是UIView自动获取对UIViewController的引用,它是响应者链。
我在apple开发库中找到了段落,引用是here
对于Action消息,当用户操作控件(例如按钮或开关)并且action方法的目标为nil时,消息将通过从控制视图开始的响应者链发送。 /强>
下图显示了响应者链路径,你应该知道如果初始对象 - 命中测试视图或第一响应者没有处理事件,UIKit会将事件传递给链中的下一个响应者。 / p>
正如你在图像中看到的那样,UIViewController在响应器链中,所以如果UIViewController的最顶层视图(这里是YLSFirstView)无法处理事件,它将被传递给它的UIViewController(这里是YLSFirstViewController)