【问题标题】:When is viewWillDisappear called? and when is it not?何时调用 viewWillDisappear?什么时候不是?
【发布时间】:2011-03-09 06:05:19
【问题描述】:

我有以下场景:

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

  • 使用 NIB 文件实例化 vcB -(当用户点击 UI 中的按钮时)
  • 在 vcB 中初始化 iVar
  • 使用 presentModalViewController 呈现 vcB
  • 在 vcB 的 viewDidLoad 中命中断点
  • 在加载来自 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的viewWillDisappear?什么情况下才被调用?
  2. 为什么第二次没有调用vcB的viewDidLoad?我应该改用“addSubview”吗?

在此先感谢....萨姆。

【问题讨论】:

  • 你不必道歉。只需学习如何使用标记!
  • 您可以编辑,尤其是为了提高清晰度、修复错误等。

标签: ios objective-c


【解决方案1】:

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

-viewDidLoad 和 -viewWillDisappear 不是匹配集。为了节省资源,并且由于某些视图控制器可能永远不会显示它们的视图,视图控制器仅在第一次真正需要它们时才加载它们的视图。 -viewDidLoad 在这之后被调用。

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

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

在 iOS 6 中,viewWillUnloadviewDidUnload弃用

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多