调用viewDidLoad,不调用viewWillAppear,视图不会出现在屏幕上

时间:2009-05-21 23:05:57

标签: iphone cocoa-touch uikit

更新

有人提到,不会根据文档调用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. 错误。


  4. 我检查过的事情:

    viewControllerBs Nib的名称是正确的。

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

    viewControllerB及其视图都是非零的。

    最重要的是,SDK [编辑]测试版5中的一切都很棒!

    有什么想法吗? 它必须是愚蠢的......

5 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:3)

不要忘记致电

[super viewWillAppear:animated];

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

文档说:

  

如果覆盖此方法,则必须在实施中的某个时刻调用super。

答案 2 :(得分:1)

尝试

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

答案 3 :(得分:0)

关闭此事:

我永远找不到解决方案,但从那以后SDK 3.0就是标准,而且这一点已经没有实际意义了。代码在SDK的当前版本中可以正常工作。

答案 4 :(得分:0)

我猜您的观点不是根视图。您可能正在使用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协议。