考虑一个storyboard我们有UITabBarController,其中包含UINavigationController中嵌入的任何UIViewController(让我们称之为VC)。我们希望VC在其导航栏上有一个BarButtonItems。这个故事板由来自另一个故事板(具有另一个导航控制器)的push segue呈现。
XCode中的一切看起来都不错,但是navigation bar does not change in VC at the runtime。然而,当我将这个故事板从推送改为模态时,一切似乎都很好。恕我直言,这是因为嵌入了导航控制器,但我没有看到任何原因导致它无法正常工作。任何想法如何合法地解决它(通过推动呈现)并且没有任何痛苦将是有帮助的。
提前致谢
答案 0 :(得分:0)
所以我认为你必须使用一些代码来解决你的问题,但不是很多。我构建了一个测试项目来测试它,并将图像与代码一起附加。 首先,如果我理解正确,你有一个navigationController推送有问题的新故事板。见附图。
我将故事板命名为正在推送,因为这就是正在发生的事情。然后在我的故事板名为Push here是设置。
在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中的第一个控制器中将代码从true更改为false。
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视图控制器中,但您希望将父级保留在选项卡1中以便能够使用后退按钮返回,则可以在viewWillAppear中进行设置,以便在视图控制器1中看起来像这样。 / p>
//tabcontroller vc 1
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.isNavigationBarHidden = false
}
在tabcontroller视图控制器2中,条形图中的项目可以执行此操作。 // tabbarcontroller vc 2,带有自己的navigationcontroller 覆盖func viewWillAppear(_ animated:Bool){ super.viewWillAppear(动画) self.parent?.navigationController?.isNavigationBarHidden = true }
最后,如果您希望后退按钮在两个控制器中都可见但需要不同的右按钮,请在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;
}
在上面的两个例子中,我们保留了父导航控制器,因此您不需要在uinavigation控制器中嵌入选项卡控制器的视图控制器。
如果你想在viewWillAppear中隐藏/显示父导航控制器,你也可以使用上面代码的组合。其中一些取决于您现在和将来选择的视图层次结构。