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]
。
您是否在您的viewWillAppear
、viewWillLayoutSubviews
、viewDidLayoutSubviews
或updateViewContraints
(或他们调用的任何方法)中做任何会阻塞、永远循环等的事情?如果此时您在调试器中中断,调用堆栈是什么样的?
请更新您的问题以在此处添加代码而不是将其放在评论中,它会更容易阅读...
【参考方案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
的无限循环。这是在 viewWillAppear
和 viewDidAppear
之间发生的事情。
【讨论】:
【参考方案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 没有在 UIPageViewController 孩子上被调用