如何更改独立于标签栏项目标题的uiviewcontroller标题


104

我在视图中设置了这样的视图控制器标题:

self.title = @"my title";

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

当我单击包含视图控制器的选项卡时,选项卡栏项目的标题uiviewcontroller更改为:我的标题

我想更改视图控制器,但选项卡栏项保留标题:Title

我该怎么做?

Answers:


219

听起来您想更改导航栏中的标题,但不更改标签栏中的标题。这应该做到这一点。

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

迅速:

self.navigationItem.title = "My Title"

1
确保,如果您仍在使用self.title来设置uitabbar标题,请在之后设置self.navigation setTitle否则将不起作用
simon_smiley 2015年

2
Swift

1
非常感谢使用Swift 4.2在Xcode 10.2中为我工作。
jangelsb

174

所以对于那些仍然不了解它的人(例如我)

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

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

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


20

迅速

设置顶部栏标题

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

设置标签项目标题

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

设置两个标题

self.title = "both titles"

什么topItem
imike

2
这是我可以在配置中设置顶部栏标题的唯一方法,不确定为什么“ self.navigationItem.title”对我不起作用。
JohnnyC


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

现在,您将可以拥有与为定义的标题不同的标题(由VC设置)tabBarItem


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中更新标题,但是基于我所看到的,我认为没有必要。


0

可能有点晚了(但是)。

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

如果要使用单独的标题,则需要手动设置它们,通常需要设置VC的标题,然后专门设置tabBarItem的标题,因为它是tabBarItem的属性。


0

斯威夫特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")
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.