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

Sam*_*Sam 5 objective-c ios

我有以下场景:

在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'吗?

在此先感谢....山姆.

Cal*_*leb 11

正如您可能从名称中猜到的那样,每当视图控制器的视图即将被隐藏,删除等时,都会调用-viewWillDisappear.有关UIViewController参考页面的完整描述.

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

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

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

在iOS 6中viewWillUnload并且viewDidUnload弃用

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