Answers:
对于Swift来说,
self.navigationItem.title = "Navigation bar title"
self.title = "Tab bar title"
注意:如果您在每个视图控制器的根部都有一个带有导航控制器的选项卡栏控制器,则在设置时,在视图控制器上设置选项卡栏项不会影响标题navigationItem.title
。您需要将设置为tabBarItem
导航控制器,以便从选项卡栏控制器中将其拾取。
别人发布的答案都没有对我有用,因为我的标签栏的视图控制器都在其根部有导航控制器-这是的常见层次结构模式UITabBarController
。你必须设置导航控制器tabBarItem
,而不是拿到冠军,从不同显示navigationItem
的标题
您可以这样创建您的应用程序tabBarItem
并将它们直接关联到您的VC。
let tabBarVCOne = BooksListViewController()
tabBarVCOne.tabBarItem = UITabBarItem(title: "Books", image: nil, tag: 0)
tabBarViewControllers.append(tabBarVCOne)
...
然后,您将得到以下内容:
//Wrap each view controller in a navigation controller.
self.viewControllers = tabBarViewControllers.map(UINavigationController.init)
但这应该更改为以下内容,以便tabBarItem
从视图控制器中获取已关联的对象并将其自动设置到导航控制器上。
self.viewControllers = tabBarViewControllers.map({
let navigationController = UINavigationController(rootViewController: $0)
navigationController.tabBarItem = $0.tabBarItem
return navigationController
})
现在,您将可以拥有与为定义的标题不同的标题(由VC设置)tabBarItem
。
太晚了。您可以将TabBarController本身用作UITabBarControllerDelegate和UINavigationControllerDelegate,并将它们分别嵌入每个选项卡中。
。H:
@interface YourTabBarController : UITabBarController <UITabBarControllerDelegate, UINavigationControllerDelegate>
@end
.m:
- (void) viewDidLoad {
// UITabBarControllerDelegate
self.delegate = self;
// UINavigationControllerDelegates
yourNavigationController.delegate = self;
...
}
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
yourNavigationController.tabBarItem.title = @"Tab Bar Title";
...
}
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
yourNavigationController.tabBarItem.title = @"Tab Bar Title";
...
}
根据一些快速测试,这两个委托操作似乎应该涵盖所有宽松的情况,并且无论您是切换选项卡还是在导航控制器中浏览,都会更新标题。为了完整起见,您也可以在didShowViewController中更新标题,但是基于我所看到的,我认为没有必要。
在这里,我为UIViewController创建了一个扩展:
import UIKit
extension UIViewController {
/// Setting the navigation title and tab bar title
///
/// - Parameters:
/// - navigationTitle: Navigation title
/// - tabBarTitle: TabBar title
func setTitles(navigationTitle: String, tabBarTitle: String) {
// Order is important here!
title = tabBarTitle
navigationItem.title = navigationTitle
}
}
然后从您的控制器:
override func viewDidLoad() {
super.viewDidLoad()
setTitles(navigationTitle: "Login", tabBarTitle: "Home")
}