想象一下,我有一个名为blueView
的视图控制器和另一个名为greenView
的视图控制器。然后,我将greenView.view
添加为blueView.view
的子视图。现在假设在进行一些用户互动后,我想使用以下内容从greenView.view
删除blueView.view
:
[self.view removeFromSuperview]
这里到底发生了什么? blueView.view
是否曾重新绘制过?我认为可能会调用viewDidLoad
方法,但是在NSLog
中放入viewDidLoad
消息后,在删除子视图后从未调用过它。当你从超级浏览中删除子视图时,对于实际发生的事情的任何澄清将不胜感激。
答案 0 :(得分:4)
首先,视图控制器意味着一次管理整个视图层次结构;你不应该有两个视图控制器(除了像UINavigationController这样的容器控制器)同时处于活动状态。请参阅this SO question and my answer以更好地了解这一重点。所以,你描述的特殊情况不应该出现。 (旁白:人们常常混淆视图和视图控制器,因此将视图控制器名称以“-view”结尾,如“blueView”一样没有帮助。将其命名为“blueViewController”以避免混淆。)
其次,正如@InsertWittyName指出的那样,-viewDidLoad
是一个UIViewController方法,而不是UIView方法。更进一步,视图控制器和-viewDidLoad
都没有在视图中添加或删除子视图的任何作用。首次创建视图控制器视图时会调用-viewDidLoad
。它基本上只是一种延迟视图控制器初始化视图相关部分的方法,直到创建视图层次结构之后,所以没有理由再次调用它,因为从层次结构中删除了子视图。
最后,视图如何从超级视图中删除自身实际上是一个实现细节 - 它可能在superview上调用私有UIView方法,或者它可能直接修改superview的子视图列表或其他内容。我没有在文档中看到任何明确表示superview将在删除子视图后重绘的内容,但根据我的经验,superview确实重绘了自己。您可以通过在superview的-drawRect
方法上放置一个断点来检查这一点。