1

想象一下,我有一个名为的视图控制器blueView和另一个名为greenView. 然后我添加greenView.viewblueView.view. 现在假设在一些用户交互之后,我想greenView.viewblueView.view使用中删除:

[self.view removeFromSuperview]

这里实际发生了什么?是否blueView.view曾经重绘?我认为viewDidLoad可能会调用该方法,但是在将NSLog消息放入viewDidLoad后,删除子视图后从未调用过该方法。当您从其父视图中删除子视图时,任何关于实际发生的事情的澄清将不胜感激。

4

1 回答 1

4

首先,视图控制器旨在一次管理整个视图层次结构;您不应该同时激活两个视图控制器(除了 UINavigationController 之类的容器控制器)。请参阅这个 SO 问题和我的回答,以更好地理解这一点。所以,你描述的特殊情况不应该出现。(顺便说一句:人们经常混淆视图和视图控制器,所以给你的视图控制器命名以“-view”结尾是没有帮助的,比如“blueView”。称之为“blueViewController”以避免混淆。)

其次,正如@InsertWittyName 指出的那样,-viewDidLoad是 UIViewController 方法,而不是 UIView 方法。更进一步,视图控制器-viewDidLoad在从视图中添加或删除子视图方面都没有任何作用。-viewDidLoad在首次创建视图控制器的视图时调用。它基本上只是将视图控制器初始化的视图相关部分推迟到创建视图层次结构之后的一种方式,因此没有理由仅仅因为从层次结构中删除子视图而再次调用它。

最后,视图如何从其父视图中移除自己实际上是一个实现细节——它可能会调用父视图上的私有 UIView 方法,或者它可能会直接修改父视图的子视图列表,或者其他什么。我在文档中没有看到任何明确说明在删除子视图后超级视图将重绘自身的内容,但根据我的经验,超级视图确实会重绘自身。-drawRect您可以通过在超级视图的方法上放置断点来检查这一点。

于 2011-07-28T18:45:22.563 回答