回答:
ナビゲーションバーのタイトルは変更したいが、タブバーのタイトルは変更したくないようです。これでうまくいくはずです。
[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
?
以下のためにスウィフトは、これを使用します
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
})
これで、に定義されたタイトルとは別のタイトル(VCから設定)を使用できるようになりますtabBarItem
。
これにはかなり遅れます。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";
...
}
いくつかの簡単なテストに基づいて、これらの2つのデリゲートアクションは緩いケースをカバーする必要があり、タブを切り替えている場合でも、ナビゲーションコントローラーでブラウジングしている場合でも、タイトルを更新します。完全を期すために、didShowViewControllerでタイトルを更新することもできますが、私が見たものに基づいて、それが必要だとは思いません。
これで、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")
}