UIView可以自动获取对UIViewController的引用吗?

mic*_*ael 2 objective-c uiviewcontroller uiview ios

今天我发现一件奇怪的事情,似乎我UIView可以UIViewController自动获得对我的引用

UIView声明了一个控制器属性:

@interface YLSFirstView : UIView
   @property YLSFirstViewController *controller;
@end
Run Code Online (Sandbox Code Playgroud)

在.m文件中,我将该控制器设置为按钮目标:

[button addTarget:self.controller action:@selector(testAction) forControlEvents:UIControlEventTouchUpInside];
Run Code Online (Sandbox Code Playgroud)

当然,在控制器.m文件中,我实现了那个动作(testAction)

以下是代码实例和init的UIViewUIController,但是我从来没有设置控制器@property!

YLSFirstViewController *first = [[YLSFirstViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
first.view = [[YLSFirstView alloc] initWithFrame:CGRectNull];
Run Code Online (Sandbox Code Playgroud)

让我感到惊讶的是:当我点击按钮时,动作" testAction" ViewController会被调用...

我对此很困惑,为什么@property控制器在UIView获得正确的参考?是否有一些潜规则iOS

PS:顺便说一句,有几次(不常见),按钮失去响应,当我点击它时,什么也没发生.在大多数时候,它只是运作良好.我不知道是否有与我上面描述的相关的东西.

你能告诉我答案吗?非常感谢

Kud*_*oCC 5

它不是UIView自动获取对UIViewController的引用,它是响应者链.

我在苹果开发库中找到了段落,参考就在这里

对于Action消息,当用户操作控件(例如按钮或开关)并且action方法的目标为nil时,将通过从控件视图开始的响应者链发送消息.

下图显示了响应者链路径,您应该知道如果初始对象 - 命中测试视图或第一响应者未处理事件,UIKit会将事件传递给链中的下一个响应者.

正如你在图像中看到的那样,UIViewController在响应链中,所以如果UIViewController的最顶层视图(这里是YLSFirstView)无法处理事件,它将被传递给它的UIViewController(这里是YLSFirstViewController).

在此输入图像描述