在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都没有用;我也明白,在子视图或以编程方式创建的视图中,这些方法不会被引发;但是这不适用于案例,我也想知道为什么这些“生命周期”方法中的一个被引发而另一个没有。
有什么想法吗?谢谢!
答案 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)
这可能是因为您在viewDidLoad
或viewWillAppear
中向您的父VC添加了一个子视图控制器。孩子的外表阻止了对viewDidAppear
的呼叫。
这是一个疯狂的事情,我只知道,因为这是我的代码中的一个错误。我的意思是将子VC添加到此VC,而不是父VC。
答案 4 :(得分:0)
在一种情况下,将调用viewWillAppear
但不会调用viewDidAppear
。
假设您有两个viewControllers
,然后从第一个控制器推到第二个控制器。然后,使用滑动,您想返回第一个控制器,两个控制器同时显示,并且此时将从第一个控制器调用viewWillAppear
。
这样,您无需完成滑动并停留在第二个控制器上,并且不会从第一个控制器调用viewDidAppear
。