首页 文章

UIViewController:调用viewWillAppear,而不是viewDidAppear

提问于
浏览
15

在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推送相应的视图控制器对象 .

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

但是, while methods viewDidLoad and viewWillAppear are called, the method viewDidAppear is not called. 任何人都可以告诉我为什么?我在网上找到的大多数问题和这里处理viewWillAppear / viewDidAppear都没有用;我也明白,在子视图或以编程方式创建的视图中,这些方法不会被引发;但这不适用于案例,我也想知道为什么这些方法中的一个被引发而另一个没有 .

任何的想法?谢谢!

4 回答

  • 18

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

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

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

    希望这有助于某人!

  • 0

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

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

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

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

    在它应该工作的情况下,我通常会创建一个新类,并在此时引入一个功能,看看我是否能以这种方式工作 . 我在一个新的基于导航的项目中尝试了你的代码,我在文本字段中添加了一个带有插座的新 UIViewController . 然后我粘贴了问题中的代码,它按预期工作 .

  • 0

    我有同样的问题 .

    我复制/粘贴了 viewDidAppear 以创建 viewWillAppear 但忘记更改 super.viewDidAppear() 电话 . 这似乎阻止被召唤.1460591_ .

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

  • 0

    这可能是因为您在 viewDidLoadviewWillAppear 中向父VC添加了子视图控制器 . 孩子的外表阻止了对 viewDidAppear 的调用 .

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

相关问题