这让我感到困惑。
说你做:
[self.view addSubview: someController.view];
someController如何知道正在加载视图并调用viewDidAppear等?
我们传递的是它的视图,而不是控制器。然而有些控制器知道。
如果self.view本身不在窗口的视图Hierarchy中,会发生什么。 someController的viewWillAppear等会被调用吗?
实现这一点的一种方法是让视图有一个指向控制器的弱指针,比如它的委托,然后检查视图本身是否是窗口对象的后代。
这是实际实施的方式吗?如果没有,它是如何实际完成的?即使它不是,认为它是以这种方式实现的也是正确的吗?
我关注的是: 我很好奇,因为我想了解这个viewWillAppear是如何出现的。几个月我和IOS一起打电话给那些明确不知道为什么叫它或不被叫的人。有很多帖子抱怨viewWillAppear / Disapear被调用或未被调用。有些人被叫了两次。我想确切知道它是如何以及何时被调用的。我很擅长但还没到那里。
答案 0 :(得分:2)
我从来没有见过UIKit的源代码,但我确信它是你怀疑的,并且UIView有一个对UIViewController的私有引用。这由documentation for UIResponder确认。由于UIView和UIViewController都参与响应者链,您可以通过调用视图的nextResponder
方法(强调我的)来从视图中获取对控制器的引用:
UIResponder类不会自动存储或设置下一个响应者,而是默认返回nil。子类必须覆盖此方法以设置下一个响应者。 UIView通过返回管理它的UIViewController对象(如果有的话)或超级视图(如果没有)来实现此方法; UIViewController通过返回其视图的superview来实现该方法; UIWindow返回应用程序对象,UIApplication返回nil。
关于你的另一个问题:除非视图真正出现,否则我认为不会调用viewWillAppear:
;换句话说,除非视图位于窗口的视图层次结构中。 (您可以轻松编写一个快速演示项目来测试它。)