我在视图中设置了我的视图控制器标题,确实加载了:
self.title = @"my title";
在此之前,我在情节提要中为其嵌入的视图控制器和导航控制器设置了标题。我将其设置为:“标题”;
当我单击包含视图控制器的选项卡时,选项卡栏项目的标题和 uiviewcontroller
更改为:我的标题
我希望视图控制器更改,但标签栏项目保留标题:标题
我怎样才能做到这一点?
听起来您希望更改导航栏中的标题,但不想更改标签栏中的标题。这应该这样做。
[self.navigationItem setTitle:@"my title"];
迅速:
self.navigationItem.title = "My Title"
所以对于那些仍然不明白的人(比如我)
self.navigationItem.title = @"my title";
设置导航栏标题。
self.tabBarItem.title = @"my title";
设置 标签栏 标题。
self.title = @"my title";
设置这两者。
迅速
设置顶栏标题
self.navigationController?.navigationBar.topItem?.title = "top title"
设置标签项标题
self.tabBarController?.tabBar.items?[0].title = "tab title"
设置两个标题
self.title = "both titles"
topItem
是什么?
对于 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
})
您现在可以拥有与为 tabBarItem
定义的标题分开的不同标题(从您的 VC 设置)。
斯威夫特 4.2
在这里,我为 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")
}
这很晚。您可以让您的 TabBarController 充当其自身的 UITabBarControllerDelegate 和 UINavigationControllerDelegate 以及分别嵌入在每个选项卡中的导航控制器。
。H:
@interface YourTabBarController : UITabBarController <UITabBarControllerDelegate, UINavigationControllerDelegate>
@end
米:
- (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 中更新您的标题,但根据我所看到的,我认为没有必要。
可能有点晚了(但是)。
设置 VC 的标题会更改 Navigation 和 tabBar 的标题。 (如果 VC 已经连接到两者)。
如果你想有单独的标题,你需要手动设置这些,你通常为 VC 设置标题,然后特别是 tabBarItem 的标题,因为它是
设置导航标题是正确的答案,但是当它对我不起作用时,因为我只使用了 tabbarcontroller 和与之相关的控制器。首先,我需要为视图控制器添加导航控制器,然后它才能完美运行。
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = "Navigation bar title"
}
https://i.stack.imgur.com/i1RCb.png