viewWillAppear被调用,但是在pushViewController之后没有调用viewDidAppear

时间:2015-12-18 09:54:21

标签: ios objective-c iphone pushviewcontroller

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

normal viewDidAppear callstack

viewDidAppear after enterBackground callstack

6 个答案:

答案 0 :(得分:0)

你推入视图层次结构的viewcontroller是否意外地覆盖了viewWillAppear / viewDidAppear而没有调用[super viewWillAppear / viewDidAppear:animated]?

答案 1 :(得分:0)

您可能在viewWillAppear方法中意外调用[super viewDidLoad]

答案 2 :(得分:0)

如果你能责备:

  1. 在没有视图时尝试使用左边缘弹出手势 它下面的控制器(即在根视图控制器上,你的VC-Home 控制器)
  2. 在此之后尝试点击任何UI元素。
  3. 当当前viewController是导航控制器中的第一个VC时,禁用 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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

在我的实现中,我有一个自定义Tab栏控制器,并且出于某些原因viewDid Appear为空,让超级调用解决了它。

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

答案 5 :(得分:-1)

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