什么时候调用viewWillDisappear?什么时候不是?

时间:2011-03-09 06:05:19

标签: ios objective-c

我有以下情况:

在vcA中(当用户点击UI中的按钮时):

  • 使用NIB文件实例化vcB - (当用户点击UI中的按钮时)
  • 在vcB中初始化iVar
  • 使用presentModalViewController呈现vcB
  • 在vcB的viewDidLoad中点击breakPoint
  • 在加载vcB视图之前,调用vcA的viewWillDisappear(我通过NSLog语句看到它)
  • 从vcB加载视图
  • 显示其iVar的正确值(在vcA中设置)
  • 使用dismissModalViewController解除vcB

回到vcA -

重复该过程(模拟用户在UI中点击相同按钮的操作):

  • 使用NIB文件实例化vcB
  • 在vcB
  • 中更改iVar的值
  • 使用presentModalViewController呈现vcB
  • 这次,vcB的viewDidLoad中的断点未被点击
  • 在加载vcB视图之前,此次调用了vcA的viewWillDisappear
  • 从vcB加载视图
  • 显示其iVar的错误值(这是以前的值)

所以,我非常困惑。

  1. 为什么要调用vcA的viewWillDis?被称为的条件是什么?
  2. 为什么第二次没有调用vcB的viewDidLoad?我应该使用'addSubview'吗?
  3. 提前致谢...... Sam。

1 个答案:

答案 0 :(得分:11)

正如您可能从名称中猜到的那样,每当视图控制器的视图即将被隐藏,删除等时,都会调用-viewWillDisappear。UIViewController reference page上的完整描述。

-viewDidLoad和-viewWillDisappear不是匹配的集合。为了节省资源,并且由于某些视图控制器可能永远不会最终显示其视图,因此视图控制器仅在第一次实际需要时才加载视图。 -viewDidLoad在发生后调用。

-viewWillAppear和-viewDidAppear在实际显示视图之前和之后被调用。同样,在视图不再可见之前和之后调用-viewWillDisappear和-viewDidDisappear。

最后,-viewDidUnload是-viewDidLoad的对应部分,如果视图被丢弃则调用它。当系统需要释放一些内存时就会发生这种情况,但根本不会发生这种情况。

在iOS 6中viewWillUnloadviewDidUnload 已弃用

所以,为了直接解决你的第二个问题,vcB的-viewDidLoad没有第二次被调用,因为到那时vcB已经加载了它的视图并且不需要再次执行它。