导航栏进入混乱状态

Navigation bar goes into confusional state

这个bug是在iOS 7中首次发现的,在iOS 8中也可以重现。

有三个视图控制器A、B 和C。由UINavigationController 管理。我想隐藏控制器 A 的导航栏,而不是其他控制器。

这是我为控制器 A 编写的代码。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    self.navigationController.navigationBarHidden = YES;
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    self.navigationController.navigationBarHidden = NO;
}

当用户通过导航 backBarButtonItem 返回时,对我来说效果很好。但是当用户从左侧滑动 backwardsforward 时(即实际上并没有从控制器 B 返回到控制器 A,而是最终停留在控制器 B),导航栏会变得混乱满足。

这里有一个演示来说明这个问题:[Demo]:https://github.com/heistings/NavigationTest

这个问题可以通过禁用导航控制器的 interactivePopGestureRecognizer 来简单解决,但不能说它是完美的:

self.navigationController.interactivePopGestureRecognizer.enabled = NO;

使用 animated 属性 到 YES

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}

也许这会对你有所帮助。

这可能是解决此问题的最佳方法,因为我们已经从框架中获得了 animated

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

我知道你的问题了。 首先将导航控制器嵌入到 ViewController...

  1. 点击故事板...
  2. 单击视图控制器...
  3. 转到编辑器部分。
  4. 点击嵌入,然后点击导航控制器。

然后写下下面的代码:

 - (void)viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated];

   [self.navigationController setNavigationBarHidden:YES animated:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [self.navigationController setNavigationBarHidden:NO animated:animated];
    }