UIViewController:调用viewWillAppear,而不是viewDidAppear

Sve*_*ffe 16 iphone lifecycle uiviewcontroller

在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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

任何的想法?谢谢!

小智 22

我有这个问题发生在我身上:viewWillAppear被召唤但viewDidAppear不是!

我终于弄清楚这是因为我有一个tabBarController地方,我自己超载了viewDidAppear,忘记了[super viewDidAppear:animated];

VC在每个标签中都丢掉了!将该行添加回来为我的其他人修复它VC's.

希望这有助于某人!


Rob*_*und 0

除非您正在做一些自定义的事情,而您说您没有这样做,否则viewDidAppear:应该始终遵循对 的调用。viewWillAppear:我不知道为什么它不起作用,但这里有一些想法:

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

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

您尝试过进行清洁吗?有时这会有所帮助。

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