【问题标题】:viewDidLoad gets called, viewWillAppear does not get called, view does not appear on screenviewDidLoad 被调用,viewWillAppear 没有被调用,视图没有出现在屏幕上
【发布时间】:2010-10-28 02:22:24
【问题描述】:

更新

已经提到,根据文档不会调用 viewWillAppear 和 viewDidAppear。 但是,我没有在这些方法中执行初始化,也没有向视图添加 UI 元素。

我只是用它们来放置断点来尝试调试。

还有其他想法吗?


原始问题

我被难住了。我正在重构一些代码并且遇到了一些奇怪的行为......

我在没有 nib 的情况下初始化 viewController A 并以编程方式设置视图。

控制器 A 中的 viewDidLoad 被调用。

在 viewController A 的 viewDidLoad 中,我从一个 nib 初始化 viewController B。

我将 viewControllerB.view 添加为 viewControllerA.view 的子视图

控制器 B 的 viewDidload 被调用。


然后就变得奇怪了:

  1. viewWillAppear 和 viewDidAppear viewController B 从不得到 调用。

  2. viewControllerB.view 从不 它在屏幕上。

  3. 错误。


我检查的内容:

viewControllerBs Nib 的名称是正确的。

viewControllerB 的视图出口连接到一个视图。

viewControllerB 和它的视图都是非零的。

最重要的是,SDK [redacted] beta 5 中一切正常!

有什么想法吗? 这一定是件很傻的事..

【问题讨论】:

  • 所以这适用于 sdk3 但不适用于早期的?
  • 查看 Ramin 关于 viewWillAppear 之谜的回答。它在文档中,但不容易找到。不知道为什么 viewControllerB 永远不会出现在屏幕上。您是否在 viewWillApeear 中进行任何重要的初始化?
  • +1 用于在此处提问之前检查的事项列表
  • 不,我在 viewDidLoad(s) 之外不执行任何初始化,是的,它在 3.0 中工作,我继续通过为 3.0 编译来进行正常编码,但我真的希望在 2.2 中进行编译.1 以及

标签: iphone cocoa-touch uikit


【解决方案1】:

如果通过代码将视图控制器添加到视图层次结构中,视图控制器将不会收到viewWillAppear(或viewDidAppear)消息。如果您自己添加它,则必须自己向视图控制器发送消息。

【讨论】:

  • 谢谢,这有助于我理解为什么 viewWillAppears/didAppears 没有被调用。但是,问题仍然存在
【解决方案2】:

别忘了打电话

[super viewWillAppear:animated];

无论你在哪里重新定义它。

文档说:

如果你重写这个方法,你必须在你的实现中调用 super。

【讨论】:

  • 我正在使用带有导航控制器/视图控制器的情节提要,并且未调用 viewDidAppear ......原因是我已从我的自定义子类中注释掉 [super viewDidAppear:animated] 我的一个 viewController继承自。嗬!不知道我最初为什么这样做(我认为是为了解决竞争条件。)取消注释解决了这个问题!谢谢提醒!
【解决方案3】:

试试

-(void) viewDidAppear:(BOOL)animated {
// whatever
}

【讨论】:

    【解决方案4】:

    我猜你的视图不是根视图。你可能正在使用 UINavigationController 所以尝试实现这个方法

    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    

    或者这个

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    

    并添加您的 viewDidLoad

    this.navController.delegate = self;
    

    (不要忘记在你的 .h 文件中添加 UINavigationControllerDelegate 协议。

    【讨论】:

      【解决方案5】:

      结案:

      我永远找不到解决方案,但从那时起,SDK 3.0 成为标准,这一点已变得毫无意义。该代码在当前版本的 SDK 中可以正常工作。

      【讨论】:

        猜你喜欢
        • 2016-03-24
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 2011-05-19
        • 1970-01-01
        • 2011-04-03
        • 2017-06-12
        • 2015-02-18
        相关资源
        最近更新 更多