如何在Swift中设置导航栏标题?

20
我试图在Swift中设置导航栏Navigation Bar的标题,我设置了Tab Bar,但在 Navigation Bar 中没有任何显示,没有按钮,没有标题,没有任何内容。我使用了一些代码,但在使用 Tab Bar 时它不起作用,当我删除 Tab Bar 时,代码能够正常工作, Navigation Bar 的标题和按钮都会显示出来。
我用于标题的代码是:
override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationItem.title = "My Title"

}

Main.storyboard中,我将导航控制器(Navigation Controller)标签栏控制器(Tab Bar Controller)相连,如图片所示。

图片描述

那么,如何解决这个问题呢?问题在于在使用标签栏(Tab Bar)导航栏(Navigation Bar)无法正常工作。


1
你把导航控制器和标签栏控制器搞反了。标签栏应该是根视图。然后每个标签应该有一个导航控制器。这样可以使用标签栏的标准控件,并且设置标题会更加方便。 - Fogmeister
1
当结合选项卡栏控制器和导航控制器时,根控制器应该是选项卡栏控制器,每个选项卡都应该有自己的导航控制器。请参见https://dev59.com/14Pba4cB1Zd3GeqPyujd#26153273。 - vacawama
3个回答

31

由于Tab Bar实际上是Navigation BarRoot View Controller,因此您需要在viewWillAppear函数中设置UITabBarControllertitle,以便每次切换标签时都会发生:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.tabBarController?.navigationItem.title = "My Title"
    self.tabBarController?.navigationItem.leftBarButtonItem = settingsButton //This is the IBOutlet variable that you previously added
}

但更好的做法实际上是相反的,像这样:

Correct view hierarchy

你应该为UITabBarController的每个子项连接一个UINavigationController,因为从语义上来说更加正确,并且维护起来更简单。


1
为每个按钮创建一个 IBOutlet,并使用我即将更新答案的代码。 - kabiroberai
@EminEmini,实际问题是你应该在UITabBarController内部放置UINavigationController而不是相反。 - kabiroberai
是的,它能工作,但有一个问题。当我切换到第二或第三个选项卡时,再回到第一个或第二个选项卡时,标题不会改变。 - Emm
1
@EminEmini,我已经修复了。请查看我的更新答案。 - kabiroberai
1
@EminEmini 没问题 :) 顺便说一下,我建议使用第二个,因为它更容易使用。 - kabiroberai
显示剩余4条评论

10

您的问题不是很清楚,如果您展示的代码来自于嵌入在UINavigationController中的UIViewController,并且navigationBar被显示出来,您可以简单地使用以下代码:

override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "My Title"
}

1
UINavigationController Class Reference中,苹果写道:

init(rootViewController: UIViewController)
参数 rootViewController
导航堆栈底部的视图控制器。此对象不能是UITabBarController类的实例。

但是如果你坚持的话,你可以这样做。但在这种情况下,你的tabbarController的ViewControllers都共享相同的标题,即tabbarController的标题。
更好的方法是为每个tabbarController的viewControllers提供一个NavigationViewController。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接