正如好奇的问题,如何UIView类的nextResponder方法实现知道谁是管理视图中的UIViewController? 该UIResponder文档状态这一点,我可以看到它的工作,但我不太明白。 据我所知,它的控制器,所以发生了什么幕后的UIView不保持一个参考? 还是我失去了一些东西明显?
我仍然很新的Objective-C和iPhone的发展,所以我道歉,如果这是显而易见的事情,但我很好奇。
谢谢!
正如好奇的问题,如何UIView类的nextResponder方法实现知道谁是管理视图中的UIViewController? 该UIResponder文档状态这一点,我可以看到它的工作,但我不太明白。 据我所知,它的控制器,所以发生了什么幕后的UIView不保持一个参考? 还是我失去了一些东西明显?
我仍然很新的Objective-C和iPhone的发展,所以我道歉,如果这是显而易见的事情,但我很好奇。
谢谢!
的响应链是从视图层次结构分开。 响应链可能是这样的:
First Responder > View Hierarchy > Window > Window Delegate > etc...
然而,对象可以将自己变成响应链,这就是UIViewController中做什么。 从文档:
因为视图控制器被紧紧地结合到它们管理的观点,它们也可用于处理事件响应链的一部分。 视图控制器本身的UIResponder类的后代和被插入到管理视图和它的父之间响应链。
方法:在大可可,这是使用-setNextResponder完成。 这种方法是不公开的在可可触摸,但无论如何这就是UIViewController中出现的事情。
如果你看一下UIView.h,你可以看到一个名为_viewDelegate一个成员变量的类型的UIViewController *的,这可能是在当视图控制器的视图属性设置的视图控制器参考存储,并且它知道,当你打电话看nextResponder。
居然有上UIView的私有API来获取它属于的UIViewController。 非常方便;)我的猜测是,当一个视图被添加到一个视图控制器(controller.view)该属性设置。
我的猜测是,该系统可以维持的UIViewController对象及其根源的UIView对象之间的映射。 为响应链的遍历的代码可以使用该映射到事件传递给相应的UIViewController对象。
子视图通常使用加入:
子视图= [的viewController视图]
[上海华addSubview子视图]
addSubview方法自动设置上海华作为子视图中,所以下一个应答器:
一)的viewController不会有上海华和子视图之间插入自己的机会。
B)的viewController不知道上海华盈,因此不能将其设置为它的下一个响应者。
C)Apple建议的图可能不会在控制器之间共享。 在不存在多线程的这种限制使得仅当存在地图视图和视图控制器感。