视图控制器如何知道它的视图将被添加?

时间:2012-10-26 06:04:23

标签: objective-c xcode4.5

这让我感到困惑。

说你做:

[self.view addSubview: someController.view];

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

我们传递的是它的视图,而不是控制器。然而有些控制器知道。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

我从来没有见过UIKit的源代码,但我确信它是你怀疑的,并且UIView有一个对UIViewController的私有引用。这由documentation for UIResponder确认。由于UIView和UIViewController都参与响应者链,您可以通过调用视图的nextResponder方法(强调我的)来从视图中获取对控制器的引用:

  

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

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