viewWillAppear 调用但 viewDidAppear 在 pushViewController 之后未调用

Posted

技术标签:

【中文标题】viewWillAppear 调用但 viewDidAppear 在 pushViewController 之后未调用【英文标题】:viewWillAppear called but viewDidAppear not called after pushViewController 【发布时间】:2015-12-18 09:54:21 【问题描述】:

在我的应用程序中,有时 pushViewController 会无缘无故地失败,发生的事情很奇怪。 navigationBar 和 navigationItem 发生了变化,但 ViewController 没有被推送。然后我不能在屏幕上点击任何东西。我发现viewWillAppear 被调用但viewDidAppear 未被调用。我按下 iPhone 的主页按钮进入后台。再次进入前台后,推送ViewController,调用viewDidAppear。我不知道为什么以及何时发生。

normal viewDidAppear callstack

viewDidAppear after enterBackground callstack

【问题讨论】:

请覆盖didRecieveMemoryWarning并检查该方法是否被调用 请检查您的 pushFromView 引用是否仍然保留? 还要检查你是否在超类上调用相同的方法。就像各自函数中的[super viewWillAppear][super viewDidAppear] 您是否在您的viewWillAppearviewWillLayoutSubviewsviewDidLayoutSubviewsupdateViewContraints(或他们调用的任何方法)中做任何会阻塞、永远循环等的事情?如果此时您在调试器中中断,调用堆栈是什么样的? 请更新您的问题以在此处添加代码而不是将其放在评论中,它会更容易阅读... 【参考方案1】:

如果您可以通过以下方式复制:

    尝试在没有视图时使用左边缘弹出手势 它下面的控制器(即在根视图控制器上,您的 VC-Home 控制器) 在此之后尝试点击任何 UI 元素。

当当前 viewController 是导航控制器中的 firstVC 时,禁用 interactivePopGestureRecognizer

- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;


- (void)viewDidDisappear:(BOOL)animated

    [super viewDidDisappear:animated];
    self.navigationController.interactivePopGestureRecognizer.enabled = YES;

参考: ios App Freezes on PushViewController

【讨论】:

【参考方案2】:

您推入视图层次结构的视图控制器是否在未调用 [super viewWillAppear/viewDidAppear:animated] 的情况下意外覆盖了 viewWillAppear/viewDidAppear?

【讨论】:

没有。每个视图控制器都称为 [super viewWillAppear/viewDidAppear:animated]。【参考方案3】:

您可能不小心在 viewWillAppear 方法中调用了 [super viewDidLoad]

【讨论】:

【参考方案4】:

对于与我有相同问题的任何人:检查您的所有自定义视图,看看您是否没有layoutSubviews 的无限循环。这是在 viewWillAppearviewDidAppear 之间发生的事情。

【讨论】:

【参考方案5】:

在我的实现中,我有一个自定义标签栏控制器,但由于某种原因 viewDid 出现为空,因此使用超级调用解决了它。

override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated) //was missing this line

【讨论】:

【参考方案6】:

你知道,如果你覆盖navigationController.interactivePopGestureRecognizer.delegate并且没有适当恢复它,也会出现这个bug

【讨论】:

以上是关于viewWillAppear 调用但 viewDidAppear 在 pushViewController 之后未调用的主要内容,如果未能解决你的问题,请参考以下文章

来自 viewDidAppear 的 Segue 调用有效,但不是来自 viewWillAppear

viewDidAppear 未调用但 viewWillAppear 调用仅出现在 iOS5

触摸屏后调用 viewWillAppear

viewWillAppear 没有在 UIPageViewController 孩子上被调用

由于我的视图层次结构,显然没有调用 viewWillAppear

viewWillAppear 和 viewDidAppear 之间的滞后