So ändern Sie den Titel von uiviewcontroller unabhängig vom Titel des Registerkartenelements


104

Ich stelle den Titel meines View Controllers so ein, dass in der Ansicht Folgendes geladen wurde:

self.title = @"my title";

Zuvor habe ich den Titel in Storyboards für den Ansichts-Controller und den Navigations-Controller festgelegt, in den er eingebettet ist. Ich habe ihn auf "Titel" gesetzt.

Wenn ich auf die Registerkarte klicke, auf der sich der Ansichts-Controller befindet, wird der Titel des Registerkartenleistenelements uiviewcontrollergeändert und in: Mein Titel geändert

Ich möchte, dass sich der Ansichts-Controller ändert, aber das Element in der Registerkartenleiste bleibt beim Titel: Titel

Wie kann ich das erreichen?

Antworten:


219

Es hört sich so an, als ob Sie möchten, dass sich der Titel in der Navigationsleiste ändert, nicht jedoch der in der Registerkartenleiste. Das sollte das tun.

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

Schnell:

self.navigationItem.title = "My Title"

1
Stellen Sie sicher, wenn Sie immer noch self.title verwenden, um Ihren uitabbar-Titel festzulegen, um self.navigation setTitle festzulegen, nachdem dies sonst nicht funktioniert
simon_smiley

2
in xcode 9 und ios 11 in swift 4 zeigt es Fehler, dass eindeutige Verwendung des Titels
Sushobhit

1
Ich arbeite für mich in Xcode 10.2 mit Swift 4.2, vielen Dank!
Jangelsb

174

Also für diejenigen, die es immer noch nicht bekommen (wie ich)

self.navigationItem.title = @"my title";Legt den Titel der Navigationsleiste fest .

self.tabBarItem.title = @"my title";setzt Tableiste Titel.

self.title = @"my title";setzt beide .


20

Schnell

Titel der oberen Leiste festlegen

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

Legen Sie den Titel des Registerkartenelements fest

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

Stellen Sie beide Titel ein

self.title = "both titles"

Was ist topItem?
Imike

2
Dies war die einzige Möglichkeit, meinen Titel in der oberen Leiste in meiner Konfiguration festzulegen. Ich bin mir nicht sicher, warum "self.navigationItem.title" bei mir nicht funktioniert hat.
JohnnyC

7

Für Swift verwenden Sie dies,

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

in xcode 9 und ios 11 in swift 4 (self.navigation.title) zeigt Fehler, dass eindeutige Verwendung des Titels
Sushobhit

6

Hinweis: Wenn Sie einen Registerkartenleisten-Controller mit Navigations-Controllern im Stammverzeichnis jedes Ansichts-Controllers haben, wirkt sich das Festlegen des Registerkartenleistenelements auf den Ansichts-Controllern nicht auf den Titel aus, wenn Sie den festlegen navigationItem.title. Sie müssen tabBarItemdas stattdessen auf dem Navigations-Controller einstellen , damit es vom Registerkarten-Controller übernommen wird.

Keine der von anderen geposteten Antworten hat für mich funktioniert, da die View-Controller meiner Registerkartenleiste alle Navigations-Controller im Stammverzeichnis haben - dies ist ein gängiges Hierarchiemuster für UITabBarController. Sie müssen tabBarItemstattdessen den Navigationscontroller einstellen , damit der Titel anders als der Titel des Titels navigationItemangezeigt wird

Sie können Ihre erstellen tabBarItemund sie direkt so Ihrem VC zuordnen.

    let tabBarVCOne = BooksListViewController()
    tabBarVCOne.tabBarItem = UITabBarItem(title: "Books", image: nil, tag: 0)

    tabBarViewControllers.append(tabBarVCOne)
    ...

Dann haben Sie so etwas:

    //Wrap each view controller in a navigation controller. 
    self.viewControllers = tabBarViewControllers.map(UINavigationController.init)

Dies sollte jedoch wie folgt geändert werden, um das bereits verknüpfte Element tabBarItemvom Ansichts-Controller abzurufen und automatisch auf den Navigations-Controller zu setzen.

    self.viewControllers = tabBarViewControllers.map({
        let navigationController = UINavigationController(rootViewController: $0)
        navigationController.tabBarItem = $0.tabBarItem
        return navigationController
    })

Sie können jetzt einen anderen Titel (von Ihrem VC festgelegt) als den für Sie definierten Titel festlegen tabBarItem.


0

Ziemlich spät dazu. Sie können Ihren TabBarController als UITabBarControllerDelegate und UINavigationControllerDelegate für sich selbst und die in jede Ihrer Registerkarten eingebetteten Navigationscontroller verwenden.

.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";
    ...
}

Basierend auf einigen schnellen Tests scheint es, dass diese beiden Delegiertenaktionen alle losen Fälle abdecken sollten und den Titel aktualisieren, unabhängig davon, ob Sie die Tabs wechseln oder in Ihrem Navigationscontroller surfen. Der Vollständigkeit halber können Sie Ihren Titel auch in didShowViewController aktualisieren , aber basierend auf dem, was ich gesehen habe, halte ich es nicht für notwendig.


0

Wahrscheinlich etwas spät (aber).

Durch Festlegen des Titels eines VC wird der Titel der Navigation UND der Registerkartenleiste geändert. (wenn der VC bereits an beide angeschlossen ist).

Wenn Sie separate Titel haben möchten, müssen Sie diese manuell festlegen. Normalerweise legen Sie den Titel für die VC und dann speziell den Titel des tabBarItem fest, da dies eine Eigenschaft von ist


0

Swift 4.2

Los geht's, ich habe eine Erweiterung für UIViewController erstellt:

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
 }

}

Und dann von Ihrem Controller:

override func viewDidLoad() {
    super.viewDidLoad()
    setTitles(navigationTitle: "Login", tabBarTitle: "Home")
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.