Ios 如何独立于选项卡栏项标题更改uiviewcontroller标题

Ios 如何独立于选项卡栏项标题更改uiviewcontroller标题,ios,cocoa-touch,uiviewcontroller,uitabbarcontroller,Ios,Cocoa Touch,Uiviewcontroller,Uitabbarcontroller,我正在按如下方式设置视图控制器标题,以查看是否加载: self.title = @"my title"; 在此之前,我在故事板中为它嵌入的视图控制器和导航控制器设置了标题。我将其设置为:“标题” 当我单击保存视图控制器的选项卡时,选项卡栏项目的标题和uiviewcontroller更改为:我的标题 我希望视图控制器更改,但选项卡栏项目保留标题:title 如何才能做到这一点?听起来您希望更改导航栏中的标题,但不希望更改选项卡栏中的标题。这应该可以做到 [self.navigationItem

我正在按如下方式设置视图控制器标题,以查看是否加载:

self.title = @"my title";
在此之前,我在故事板中为它嵌入的视图控制器和导航控制器设置了标题。我将其设置为:“标题”

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

我希望视图控制器更改,但选项卡栏项目保留标题:title


如何才能做到这一点?

听起来您希望更改导航栏中的标题,但不希望更改选项卡栏中的标题。这应该可以做到

[self.navigationItem setTitle:@"my title"];
斯威夫特:

self.navigationItem.title = "My Title"

已经很晚了。您可以让您的TabBarController充当自己的UITabbarController Delegate和UINavigationController Delegate,并将导航控制器分别嵌入每个选项卡中

.h:

根据一些快速测试,这两个代理操作似乎应该涵盖所有松散的情况,并将更新标题,无论您是切换选项卡还是在导航控制器中浏览。为了完整起见,您也可以在中更新您的标题,但根据我所看到的,我认为没有必要进行更新。

对于Swift,请使用此选项

self.navigationItem.title = "Navigation bar title" 
self.title = "Tab bar title"
可能有点晚了(但是)

设置VC的标题会更改导航和选项卡栏的标题。 (如果VC已连接到两者)


如果您想要有单独的标题,您需要手动设置这些标题,您通常会为VC设置标题,然后特别是tabBarItem的标题,因为它是

的属性,所以对于那些仍然没有获得它的人(如我)

self.navigationItem.title=@“我的标题”设置导航栏标题

self.tabBarItem.title=@“我的标题”设置选项卡栏的标题

self.title=@“我的标题”设置这两个

Swift 设置顶栏标题

self.navigationController?.navigationBar.topItem?.title = "top title"
设置选项卡项标题

self.tabBarController?.tabBar.items?[0].title = "tab title"
设置两个标题

self.title = "both titles"

注意:如果在每个视图控制器的根目录下都有一个带有导航控制器的选项卡栏控制器,那么在视图控制器上设置选项卡栏项目不会影响标题(如果您正在设置
navigationItem.title
)。您需要将
tabBarItem
设置到导航控制器上,以便从选项卡栏控制器拾取它。

其他人发布的答案中没有一个对我有效,因为我的选项卡栏的视图控制器的根都有导航控制器-这是
UITabBarController
的常见层次结构模式。您必须设置导航控制器的
选项卡项
,以使标题的显示方式与
导航项
的标题不同

您可以创建您的
选项卡项
,并直接将它们与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设置),与为
选项卡项定义的标题分开

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")
}
然后从控制器:

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

请确保,如果您仍然使用self.title设置uitabbar标题,设置self.navigation setTitle,否则它将无法在swift 4中的xcode 9和ios 11中工作,这将显示错误,使用swift 4.2在xcode 10.2中为我明确使用标题工作,非常感谢!在swift 4(self.navigation.title)中的xcode 9和ios 11中,显示了明确使用标题的错误,标题是
topItem
?这是我在配置中设置顶栏标题的唯一方法,我不知道为什么“self.navigationItem.title”对我不起作用。