【问题标题】:UIViewController: viewWillAppear is called, viewDidAppear notUIViewController: viewWillAppear 被调用,viewDidAppear 没有
【发布时间】:2011-05-19 18:29:53
【问题描述】:

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

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

但是,在调用 viewDidLoad 和 viewWillAppear 方法时,没有调用 viewDidAppear 方法。 谁能告诉我为什么?我在网上找到的大多数问题都涉及 viewWillAppear/viewDidAppear 都不起作用;我还了解到,在子视图或以编程方式创建的视图中,不会调用这些方法;但这不适用于万一,我也想知道为什么这些“生命周期”方法中的一个被调用而另一个不被调用。

有什么想法吗?谢谢!

【问题讨论】:

    标签: iphone uiviewcontroller lifecycle


    【解决方案1】:

    有一种情况,viewWillAppear 会被调用,而viewDidAppear 不会。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题。

        我复制/粘贴了viewDidAppear 以创建viewWillAppear,但忘记更改super.viewDidAppear() 调用。这似乎阻止了 viewDidAppear 被调用。

        听起来您在代码中的某个地方错过或弄乱了对超类的调用。

        【讨论】:

          【解决方案4】:

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

          我终于明白这是因为我有一个tabBarController,我重载了它自己的viewDidAppear,忘记了[super viewDidAppear:animated];

          每个标签中的每个VC 都被抛弃了!为我的另一个 VC's 添加该行。

          希望这对某人有所帮助!

          【讨论】:

          • 这正是我在我的 Swift 项目中的情况。谢谢!
          • 这正是我在我的 Swift 项目中的情况。谢谢! ——
          【解决方案5】:

          viewDidAppear: 的调用应始终跟随viewWillAppear:,除非您正在执行自定义操作,但您说您没有这样做。我不知道为什么它不起作用,但这里有一些想法:

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

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

          您是否尝试过清洁?有时这会有所帮助。

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

          【讨论】:

          • 不应该有内存问题,至少 didReceiveMemoryWarning 没有被调用。清除所有目标并没有帮助。所以我听从了你的建议,并逐步“复制”了一个新项目中的课程。它有效。 :-/ 我已经添加了我在原始类中覆盖的所有方法,并且在一个项目中它可以工作,而在另一个项目中它没有。在这两种情况下,视图都由导航控制器上的 pushViewController 显示。唯一的区别:在测试项目中有一个navcontroller,在我的项目中有三个(rootcontroller是一个tabbarcontroller)
          • @sven - 我想更改导航栏的标题视图。触发 viewWillAppear 时,似乎还没有将视图推送到导航栏。
          猜你喜欢
          • 2011-04-03
          • 1970-01-01
          • 1970-01-01
          • 2012-07-16
          • 2016-03-24
          • 2012-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多