2

这让我困惑不已。

说你这样做:

[self.view addSubview: someController.view];

someController 如何知道它的视图正在加载并调用 viewDidAppear 等?

我们传递的是视图而不是控制器。然而 someController 知道。

如果 self.view 本身不在窗口的视图层次结构中,也会发生什么。someController的viewWillAppear等会被调用吗?

实现这一点的一种方法是让视图有一个指向控制器的弱指针,比如它的委托,然后检查视图本身是否是窗口对象的后代。

这是它实际实施的方式吗?如果没有,它实际上是如何完成的?即使不是,认为它是这样实现的是否正确?

我关心的是:我很好奇,因为我想了解这个 viewWillAppear 是如何出现的。几个月我玩 IOS 打电话给那些明确不知道为什么被调用或不被调用的人。有大量帖子抱怨 viewWillAppear/Disapear 被调用或未被调用。有些人被叫了两次。我想确切地知道它是如何以及何时被调用的。我越来越擅长它,但还没有完全做到。

4

1 回答 1

2

我从未见过 UIKit 源代码,但我确信它是您所怀疑的,并且 UIView 对 UIViewController 有一个私有引用。UIResponder的文档证实了这一点。由于 UIView 和 UIViewController 都参与了响应者链,因此您可以通过调用视图的nextResponder方法(强调我的)从视图中获取对控制器的引用:

UIResponder 类不会自动存储或设置下一个响应者,而是默认返回 nil。子类必须重写此方法以设置下一个响应者。UIView 通过返回管理它的 UIViewController 对象(如果有)或其父视图(如果没有)来实现此方法;UIViewController 通过返回其视图的超级视图来实现该方法;UIWindow 返回应用程序对象,UIApplication 返回 nil。

至于您的另一个问题:viewWillAppear:除非视图实际出现,否则我认为不会被调用;换句话说,除非视图位于窗口的视图层次结构中,否则不会。(您可以轻松编写一个快速演示项目来测试它。)

于 2012-10-26T06:15:17.530 回答