【问题标题】:Life cycle of controller is not called不调用控制器的生命周期
【发布时间】:2015-11-25 04:09:28
【问题描述】:

我有两个带有 UI(xib) 的控制器,它们是 A 和 B。现在我想在 C 上显示它们中的任何一个。为了从 A 和 B 中选择,我创建了一个新的控制器 D,它决定显示谁(A 或 B)。现在就像 C 呈现 D。而 D 将 A 或 B 作为子视图控制器。

从 C 我呈现 D 喜欢:

[self presentViewController:D animated:YES completion:nil]

并且 D 具有来自(A 或 B)的子视图控制器,例如:

[self addChildViewController:(A/B)];
[self didMoveToParentViewController:(A/B)];

现在的问题是没有调用子视图控制器的生命周期。 我也使用 [(A/B) beginAppearanceTransition:YES animated:NO];但是使用这只是第一次调用生命周期。 有谁知道要解决这个问题吗?

【问题讨论】:

  • “子视图控制器的生命周期没有被调用”是什么意思?
  • 应该是D中的[(A/B) didMoveToParentViewController:self];
  • 假设“生命周期”意味着在每个 viewController 中调用 viewDidLoad(),你是否在 A 和 B viewDidLoad() 方法中正确调用了 [super viewDidLoad]?
  • "子视图控制器的生命周期没有被调用"是指A/B的viewwillappear和viewdidappear方法没有被调用。
  • @Mikael 是的,我叫 [super viewDidLoad]

标签: ios iphone uiviewcontroller


【解决方案1】:

我认为您误解了didMoveToParentViewController: 方法。这个方法的参数应该是容器。假设self是D,在你通过调用[self addChildViewController:(A/B)]将(A/B)添加到D并且动画过渡结束之后,你应该调用[(A/B) didMoveToParentViewController:self];同理,当你需要remove(A/B)时,调用[(A/B) removeFromParentViewController],那么didMoveToParentViewController:会被自动调用。

这是苹果的说明文件:

如果你正在实现自己的容器视图控制器,它必须 调用子视图的 didMoveToParentViewController: 方法 完成向新控制器的转换后的控制器,或者, 如果没有转换,则在调用 addChildViewController:方法。 removeFromParentViewController 方法自动调用 didMoveToParentViewController: 方法 子视图控制器在移除子视图后的状态。

希望这可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2016-11-21
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多