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的UIView和UIController,但是我从来没有设置控制器@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:顺便说一句,有几次(不常见),按钮失去响应,当我点击它时,什么也没发生.在大多数时候,它只是运作良好.我不知道是否有与我上面描述的相关的东西.
你能告诉我答案吗?非常感谢
它不是UIView自动获取对UIViewController的引用,它是响应者链.
我在苹果开发库中找到了段落,参考就在这里
对于Action消息,当用户操作控件(例如按钮或开关)并且action方法的目标为nil时,将通过从控件视图开始的响应者链发送消息.
下图显示了响应者链路径,您应该知道如果初始对象 - 命中测试视图或第一响应者未处理事件,UIKit会将事件传递给链中的下一个响应者.
正如你在图像中看到的那样,UIViewController在响应链中,所以如果UIViewController的最顶层视图(这里是YLSFirstView)无法处理事件,它将被传递给它的UIViewController(这里是YLSFirstViewController).

| 归档时间: |
|
| 查看次数: |
990 次 |
| 最近记录: |