【问题标题】:Navigation bar goes into confusional state导航栏进入混乱状态
【发布时间】:2015-03-24 06:38:30
【问题描述】:

这个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;

【问题讨论】:

  • 是的,你是对的,这似乎只是 iOS 的错误。
  • @iphonic 不知道它是否是一个错误,但使用动画属性可以实现这一点。
  • 这实际上不是一个错误。正如你已经说过的,navigationBar 真的很困惑,因为在 iOS7 上进行了更改。从 iOS7 开始,viewWillAppear: 方法并不意味着视图会出现,而是视图可能出现或不出现。 viewWillDisappear 方法相同。因此,在viewDidAppear: 方法上执行出现视图的任务是合适的。而且,有一种方法可以确定视图是否真的会出现在viewWillAppear: 方法上,现在找不到,但您可以四处搜索。
  • @ChintaN-Maddy-Ramani 使用[self.navigationController setNavigationBarHidden:YES animated:NO]; 仍然会带来这个问题。

标签: ios objective-c ios7


【解决方案1】:

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];
}

也许这会对你有所帮助。

【讨论】:

  • 这是我认为最好的方法,非常感谢。这确实是一个导航错误,因为使用use animated property to NO 也会带来这个错误。
  • 哦,我发现我的答案有动画问题,滑动的时候看起来很奇怪。你是最好的!
  • 我改了答案,可能是完美的
【解决方案2】:

这可能是解决此问题的最佳方法,因为我们从框架中获得了 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];
}

【讨论】:

    【解决方案3】:

    我有你的问题。 首先将导航控制器嵌入到 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];
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-19
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多