how to change uiviewcontroller title independent of tabbar item title

我正在设置我的视图控制器的标题,如下所示:

self.title = @"my title";

在此之前,我在故事板中设置了视图控制器和导航控制器的标题。我设置为: “标题”;

当我单击保存视图控制器的选项卡时,选项卡条项的标题和 uiviewcontroller变为: my title

我希望视图控制器能够改变,但是标签栏项保留标题: Title

How can I accomplish this?

44777 次浏览

这听起来像是您希望导航栏中的标题发生变化,而不是选项卡中的标题。这个应该可以。

[self.navigationItem setTitle:@"my title"];

斯威夫特:

self.navigationItem.title = "My Title"

已经很晚了。您可以让 TabBarController 分别作为自己的 UITabBarController 委托和 UINavigationController 委托,以及嵌入在每个选项卡中的导航控制器。

。 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";
...
}

基于一些快速测试,似乎这两个委托操作应该涵盖任何松散的情况,并将更新标题,无论您切换标签或浏览您的导航控制器。为了完整起见,你也可以在 做了 ShowViewController中更新你的标题,但是基于我所看到的,我认为这没有必要。

对于 斯威夫特使用这个,

self.navigationItem.title = "Navigation bar title"
self.title = "Tab bar title"

可能有点晚(但是)。

设置 VC 的标题会改变导航栏和标签栏的标题。 (如果风险投资者已经与两者都有联系)。

If you want to have separate titles, you need to manually set those, you normally set the title for the VC and then specifically the title of the tabBarItem, since it's a property of the

因此,对于那些仍然不明白(像我)

self.navigationItem.title = @"my title";设置 navigation bar标题。

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"

Note: If you have a tab bar controller with navigation controllers at the root of each view controller, setting the tab bar item on the view controllers won't affect the title if you're setting the navigationItem.title. You'll need to set the tabBarItem onto the navigation controller instead for it to be picked up from the tab bar controller.

其他人发布的答案对我来说都不起作用,因为我的标签栏视图控制器的根部都有导航控制器——这是 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
})

You will now be able to have a different title (set from your VC) separate from the title defined for your tabBarItem.

Swift 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 和控制器相关的。首先,我需要为视图控制器添加导航控制器,然后它完美地工作。

   override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = "Navigation bar title"
}

enter image description here