0

考虑一个storyboard,我们在其中有UITabBarController,其中包含嵌入UINavigationController中的任何UIViewController(让它称为VC)。我们希望VC在其导航栏上有一个BarButtonItems。这个故事板是通过从另一个故事板(具有另一个导航控制器)推动segue呈现的。iOS故事板以模态方式呈现标签栏并在XCode 8中推入

在XCode中一切都看起来不错,但navigation bar does not change in VC at the runtime。然而,当我改变将这个故事板从推送到模态时,一切似乎都很好。恕我直言,这是因为嵌入导航控制器,但我没有看到任何理由为什么它不工作。任何想法如何合法地解决它(通过推送呈现)并且没有任何痛苦将是有帮助的。

在此先感谢

回答

0

所以我认为你将不得不使用一些代码来解决您的问题,但并不多。我构建了一个测试项目来测试它,并将代码附加图像。 首先,如果我正确地理解了你,你有一个导航控制器推送有问题的新故事板。见附图。 MainStoryboard

我命名故事板被推,因为这就是发生了什么。然后在我的故事板名为Push这里是设置。 Push.storyboard

在tabbarcontroller的第一个视图控制器中,我添加了下面的代码。显然这隐藏了把我们推到这里的导航控制器。如果您然后访问控制器编号2我们新的导航控制器和项目显示。如果隐藏导航控制器在tabbarcontroller视图控制器1不是你想要做的那么。继续阅读。

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    //or to unhide from returning the opposite ->self.parent?.navigationController?.isNavigationBarHidden = true 
    self.parent?.navigationController?.isNavigationBarHidden = true 
} 

如果你不想隐藏在第一视图控制器导航控制器,但访问控制器2,当你想看到你的项目,然后添加到您的viewWillAppear中,并在viewWillAppear中第一控制器改变从代码真假。

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    // Do any additional setup after loading the view, typically from a nib. 
    self.parent?.navigationController?.isNavigationBarHidden = true 
} 

这隐藏了父导航控制器,基本上就是在您的示例中隐藏了导航控制器。所以上面隐藏了父导航控制器。这也是为什么呈现模态工作。您的导航控制器从一开始就隐藏起来。希望这可以帮助。

**编辑 如果你想要导航控制器在选项卡2视图控制器,但你想保持父母在选项卡之一能够返回与后退按钮,你可以设置它在viewWillAppear,而不是所以它会看起来像这个在视图控制器1中。

//tabcontroller vc 1 
override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    self.navigationController?.isNavigationBarHidden = false 
} 

而在带有栏中项目的tabcontroller视图控制器2中,您可以执行此操作。 // tabbarcontroller vc 2 with own navigationcontroller override func viewWillAppear(_ animated:Bool){ super.viewWillAppear(animated) self.parent?.navigationController ?.isNavigationBarHidden =真 }

最后,如果你想在两个控制器可见背部按钮,但希望不同的右按钮做编程在viewWillAppear中

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
     self.tabBarController?.navigationItem.setRightBarButton(UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(FirstViewController.editSomthing)), animated: true) 
} 

如果你想在其他控制器中删除它

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    self.tabBarController?.navigationItem.rightBarButtonItem = nil; 
} 

在上面这两个例子中,我们保留父导航控制器,所以你不需要在uinavigati中嵌入你的视图控制器的tab控制器在控制器上。

如果您还想在viewWillAppear中隐藏/显示父级导航控制器,也可以使用上述代码的组合。其中一些依赖于您现在和将来选择的视图层次结构。

+0

不错,但它也隐藏父导航栏中的后退按钮。所以在这个解决方案中缺少一些东西:) – gbread

+0

更新答案让你更加自由。可能需要使用不同的组合,并且可能需要故事板更改,或者可能会降低应用程序的开销。 – agibson007

+0

欣赏你回到此并测试和标记正确。可能为什么我三年没有回答很多问题。 :) – agibson007