UIViewController:调用viewWillAppear,而不是viewDidAppear

时间:2010-12-03 13:49:51

标签: iphone uiviewcontroller lifecycle

在UIViewController子类中,我有以下方法:

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // do something
    myTextField.text = @"Default";
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // do something
    [myTextField selectAll:self];
    [myTextField becomeFirstResponder];
}

- (void)viewDidLoad {
    [super viewDidLoad];    
    // do something
    myTextField.delegate = self;
}

NIB是使用Interface Builder创建的。导航控制器通过pushViewController推送相应的视图控制器对象。

有意行为是在文本字段中显示默认文本条目,以选择整个文本并将文本字段设置为第一响应者。 [编辑:我注意到选择所有制作第一响应者没有意义,因为选择会消失;不过,我想知道为什么这些方法的行为如下所述。]

然而,当调用方法viewDidLoad和viewWillAppear时,方法viewDidAppear不会被调用。有人可以告诉我为什么吗?我在网上找到的大多数问题和这里处理viewWillAppear / viewDidAppear都没有用;我也明白,在子视图或以编程方式创建的视图中,这些方法不会被引发;但是这不适用于案例,我也想知道为什么这些“生命周期”方法中的一个被引发而另一个没有。

有什么想法吗?谢谢!

5 个答案:

答案 0 :(得分:21)

我遇到了这个问题:viewWillAppear被调用但是viewDidAppear没有!

我终于弄清楚这是因为我有一个tabBarController我重载了它自己的viewDidAppear并忘记了[super viewDidAppear:animated];

它在每个标签中放弃了每个VC!将该行添加回来为我的其他VC's修复它。

希望这有助于某人!

答案 1 :(得分:0)

viewDidAppear:的来电应该始终遵循viewWillAppear:,除非你做的是自定义的事情,你说你不做。我不知道为什么它不起作用,但这里有一些想法:

你是否在UITextFieldDelegate的一个委托方法中做了一些奇怪的事情?它不太可能影响viewDidAppear:被调用,但它可能是罪魁祸首。

在推送视图之前,您是否已将大量内容加载到内存中?如果您在viewWillAppear:viewDidAppear:之间收到内存警告,我不确定会发生什么。

你试过干净吗?有时这可以帮助。

在这样的情况下,当它应该工作时,我通常会创建一个新类,并在当时引入一个功能,看看我是否能以这种方式工作。我在一个新的基于导航的项目中尝试了您的代码,我在其中添加了一个新的UIViewController,其中包含文本字段的出口。然后我粘贴了问题中的代码,它确实按预期工作。

答案 2 :(得分:0)

我遇到了同样的问题。

我已复制/粘贴viewDidAppear以创建viewWillAppear但忘记更改super.viewDidAppear()来电。这似乎阻止了viewDidAppear的被叫。

这听起来像你的代码中的某个地方,你错过了或搞砸了对超类的调用。

答案 3 :(得分:0)

这可能是因为您在viewDidLoadviewWillAppear中向您的父VC添加了一个子视图控制器。孩子的外表阻止了对viewDidAppear的呼叫。

这是一个疯狂的事情,我只知道,因为这是我的代码中的一个错误。我的意思是将子VC添加到此VC,而不是父VC。

答案 4 :(得分:0)

在一种情况下,将调用viewWillAppear但不会调用viewDidAppear

假设您有两个viewControllers,然后从第一个控制器推到第二个控制器。然后,使用滑动,您想返回第一个控制器,两个控制器同时显示,并且此时将从第一个控制器调用viewWillAppear

这样,您无需完成滑动并停留在第二个控制器上,并且不会从第一个控制器调用viewDidAppear