UIView的nextResponder如何知道UIViewController的是什么?(How

2019-08-20 05:18发布

正如好奇的问题,如何UIView类的nextResponder方法实现知道谁是管理视图中的UIViewController? 该UIResponder文档状态这一点,我可以看到它的工作,但我不太明白。 据我所知,它的控制器,所以发生了什么幕后的UIView不保持一个参考? 还是我失去了一些东西明显?

我仍然很新的Objective-C和iPhone的发展,所以我道歉,如果这是显而易见的事情,但我很好奇。

谢谢!

Answer 1:

的响应链是从视图层次结构分开。 响应链可能是这样的:

First Responder > View Hierarchy > Window > Window Delegate > etc...

然而,对象可以将自己变成响应链,这就是UIViewController中做什么。 从文档:

因为视图控制器被紧紧地结合到它们管理的观点,它们也可用于处理事件响应链的一部分。 视图控制器本身的UIResponder类的后代和被插入到管理视图和它的父之间响应链。

方法:在大可可,这是使用-setNextResponder完成。 这种方法是不公开的在可可触摸,但无论如何这就是UIViewController中出现的事情。



Answer 2:

如果你看一下UIView.h,你可以看到一个名为_viewDelegate一个成员变量的类型的UIViewController *的,这可能是在当视图控制器的视图属性设置的视图控制器参考存储,并且它知道,当你打电话看nextResponder。



Answer 3:

居然有上UIView的私有API来获取它属于的UIViewController。 非常方便;)我的猜测是,当一个视图被添加到一个视图控制器(controller.view)该属性设置。



Answer 4:

我的猜测是,该系统可以维持的UIViewController对象及其根源的UIView对象之间的映射。 为响应链的遍历的代码可以使用该映射到事件传递给相应的UIViewController对象。

子视图通常使用加入:

子视图= [的viewController视图]

[上海华addSubview子视图]

addSubview方法自动设置上海华作为子视图中,所以下一个应答器:

一)的viewController不会有上海华和子视图之间插入自己的机会。

B)的viewController不知道上海华盈,因此不能将其设置为它的下一个响应者。

C)Apple建议的图可能不会在控制器之间共享。 在不存在多线程的这种限制使得仅当存在地图视图和视图控制器感。



文章来源: How does UIView nextResponder know what the UIViewController is?