タブバー項目のタイトルとは関係なくuiviewcontrollerのタイトルを変更する方法


104

私はビューコントローラのタイトルをこのように設定していますが、ビューはロードされました:

self.title = @"my title";

これに先立って、私はそれが埋め込まれているビューコントローラーとナビゲーションコントローラーのストーリーボードにタイトルを設定しました。

ビューコントローラーを保持するタブをクリックすると、タブバーアイテムのタイトルがuiviewcontroller変更され、次のように変わります。

ビューコントローラを変更したいのですが、タブバーアイテムはタイトルのままにしておきます:タイトル

どうすればこれを達成できますか?

回答:


221

ナビゲーションバーのタイトルは変更したいが、タブバーのタイトルは変更したくないようです。これでうまくいくはずです。

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

迅速:

self.navigationItem.title = "My Title"

1
それでもself.titleを使用してuitabbarのタイトルを設定している場合は、self.navigation setTitleを設定してください。それ以外の場合は機能しません
simon_smiley

2
Xcode 9とSwift 4のios 11では、タイトルが明確に使用されているというエラーが表示されます
Sushobhit

1
Xcode 10.2でSwift 4.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

7

以下のためにスウィフトは、これを使用します

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

xcode 9およびswift 4(self.navigation.title)のios 11で、タイトルの明確な使用を示すエラーを表示
Sushobhit

6

注:各ビューコントローラーのルートにナビゲーションコントローラーを備えたタブバーコントローラーがある場合、ビューコントローラーでタブバーアイテムを設定しても、を設定している場合、タイトルには影響しませんnavigationItem.titletabBarItemタブバーコントローラからピックアップするには、代わりにをナビゲーションコントローラに設定する必要があります。

タブバーのビューコントローラーのルートにはすべてナビゲーションコントローラーがあるため、他のユーザーが投稿した回答はどれもうまくいきませんでした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";
    ...
}

いくつかの簡単なテストに基づいて、これらの2つのデリゲートアクションは緩いケースをカバーする必要があり、タブを切り替えている場合でも、ナビゲーションコントローラーでブラウジングしている場合でも、タイトルを更新します。完全を期すために、didShowViewControllerでタイトルを更新することもできますが、私が見たものに基づいて、それが必要だとは思いません。


0

おそらく少し遅れます(しかし)。

VCのタイトルを設定すると、ナビゲーションのタイトルとタブバーが変更されます。(VCがすでに両方に接続されている場合)。

タイトルを個別にしたい場合は、手動で設定する必要があります。通常はVCのタイトルを設定してから、具体的にはtabBarItemのタイトルを設定します。これは、


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")
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.