【问题标题】:navigation bar disappear faster than the view when use popToRootViewControllerAnimated:YES使用 popToRootViewControllerAnimated:YES 时导航栏消失得比视图快
【发布时间】:2014-01-27 17:30:15
【问题描述】:

我在导航 vc 中嵌入了根 vc,我使用
[self.navigationController setNavigationBarHidden:YES];
将导航栏设置为隐藏 它工作正常,导航栏消失了。

并推送第二个vc使用
[self.navigationController pushViewController:controller animated:YES];
在第2个vc中设置导航栏显示。一切顺利。

所以当我点击导航栏上的“后退按钮”时,我发现导航栏消失的速度比视图快,尤其是设置视图的背景为黑色,我可以看到 整个视图都是黑色的,就像从来没有导航栏一样。
我不想要这个,我只希望导航栏一直存在,直到 viewDidDisappear。

Here is a picture of the problem

我使用[self.navigationController popViewControllerAnimated:YES]; 并且必须填写 Animated is YES 才能重现此外观。

对于排序,

  1. 导航vc中的两个vc。
  2. 根 vc 的导航栏被隐藏,第二个 VC 从根 vc 推送。
  3. 第二个 vc 制作了导航栏显示。
  4. 使用[self.navigationController popViewControllerAnimated:YES] 支持。

代码位置在哪里:
ps:无论你如何设置导航栏的hidden-property,在ViewDidLoad或者ViewWillAppear或者ViewDidAppear或者其他地方,它们的外观都是一样的。

在根vc的viewDidLoad中
[self.navigationController setNavigationBarHidden:YES];

和 root vc 的 didSelectRowAtIndexPath:
[self.navigationController setNavigationBarHidden:NO];

【问题讨论】:

  • [self.navigationController setNavigationBarHidden:YES];您在代码中的哪里使用此行? viewDidLoad、viewWillAppear、viewDidAppear?
  • @jai 就在 viewDidLoad 中
  • 将您的第一个视图控制器设置为您的导航控制器委托,并在您的第一个视图控制器中实现这些委托方法。 - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 和 - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
  • 在 viewWillAppear 中执行
  • 您可以发现返回的视图控制器是第一个和第二个,因此可以更改隐藏/可见您的导航栏...

标签: ios navigationbar popviewcontrolleranimated


【解决方案1】:

哪里错了

  • RootView 和 SubView 在同一个 NavigationController 层次结构中。这意味着 navigationBar 既不属于 RootView 也不属于 SubView。
  • 在这种情况下,navigationBar 是全局的并且是唯一的。您不能只使用一个导航栏来处理两个视图的显示。

如何解决

  • 在SubView 中,我新建一个navigationBar 来替换现有的navigationBar,并将其添加到SubView 的子视图中。效果很好。

【讨论】:

    【解决方案2】:

    您只需要将setNavigationBarHidden:Yes 的调用从第二个vc 的viewWillDisappear: 移动到root vc 的viewDidAppear:

    我从视觉上知道这并不令人愉快。我只是给了你你所说的你想要的:“我只是希望导航栏一直存在,直到 viewDidDisappear。”要获得漂亮的过渡效果,您需要使用自定义过渡效果。

    【讨论】:

    • 谢谢。我明白你的想法并尝试过这种方式。这不是一个完美的方法。因为根vc没有一个导航栏,所以当第二个vc弹出导航层次时,导航栏一直存在,直到根视图运行到ViewDidAppear,这不是一个好的用户界面,@987654321 @
    • @sunydea 我刚刚给了你你所说的你想要的:“我只是希望导航栏一直存在,直到 viewDidDisappear。”请参阅我的更新答案。
    【解决方案3】:

    从 ViewDidLoad,移动 [self.navigationController setNavigationBarHidden:YES];在 ViewDidAppear 方法中。它会起作用的。

    【讨论】:

    • 是的,这可以解决一半的问题,因为当回到RootView时,NavigationBar会出现一会儿然后消失,这不是final方法。
    • 好的,请尝试在 ViewDidLoad 和 ViewDidAppear 中隐藏导航栏。 (不在 ViewWillAppear 中)..
    • 没有任何改变。但是再次感谢,当我尝试按照您的提示解决它时,突然间我终于有了解决这个问题的灵感。我会在我的回答中做详细的描述。
    【解决方案4】:

    您应该将[self.navigationController setNavigationBarHidden:NO]; 移动到您的子VC 的viewWillAppear: 并将[self.navigationController setNavigationBarHidden:YES]; 移动到您的RootView 的viewWillAppear:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      相关资源
      最近更新 更多