如何更改独立于tabbar项标题的uiviewcontroller标题

时间:2014-02-06 22:39:50

标签: ios cocoa-touch uiviewcontroller uitabbarcontroller

我正在设置我的视图控制器标题,在视图中加载:

self.title = @"my title";

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

当我点击包含视图控制器的标签时,标签栏项目的标题和uiviewcontroller更改为:我的标题

我希望视图控制器能够更改标签栏项目以保留标题:标题

我该如何做到这一点?

9 个答案:

答案 0 :(得分:177)

听起来您希望导航栏中的标题发生变化,而不是标签栏中的标题。这应该这样做。

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

夫特:

self.navigationItem.title = "My Title"

答案 1 :(得分:144)

对于那些仍然没有得到它的人(像我一样)

self.navigationItem.title = @"my title";设置导航栏标题。

self.tabBarItem.title = @"my title";设置标签栏标题。

self.title = @"my title";设置这两个

答案 2 :(得分:13)

夫特

设置顶部栏标题

self.navigationController?.navigationBar.topItem?.title = "top title"

设置标签项标题

self.tabBarController?.tabBar.items?[0].title = "tab title"

设置两个标题

self.title = "both titles"

答案 3 :(得分:7)

对于 Swift ,请使用此

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

答案 4 :(得分:6)

注意:如果您在每个视图控制器的根目录中都有一个带有导航控制器的标签栏控制器,则设置视图控制器上的标签栏项目如果您正在设置则不会影响标题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设置)。

答案 5 :(得分:0)

我相信你可以做的视图控制器的viewDidLoad方法:

self.title = @"my title";
self.tabBarItem.title = @"tab title";

答案 6 :(得分:0)

这很晚了。你可以将你的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更新您的标题,但根据我所看到的情况,我认为没有必要。

答案 7 :(得分:0)

可能有点迟了(但)。

设置VC的标题会更改导航和tabBar的标题。 (如果VC已经连接到两者)。

如果你想要单独的标题,你需要手动设置它们,你通常设置VC的标题,然后特别是tabBarItem的标题,因为它是

的属性

答案 8 :(得分:0)

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")
}