comment changer le titre de uiviewcontroller indépendamment du titre de l'élément de la barre d'onglets

104

Je suis en train de définir le titre de mes contrôleurs de vue comme ceci dans View did load:

self.title = @"my title";

avant cela, je définissais le titre dans les story-boards pour le contrôleur de vue et le contrôleur de navigation dans lesquels il est intégré. Je l'ai défini sur: "Titre";

Lorsque je clique sur l'onglet qui contient le contrôleur de vue, le titre de l'élément de la barre d'onglets et uiviewcontrollerchange en: mon titre

Je voudrais que le contrôleur de vue change mais que l'élément de la barre d'onglets reste avec le titre: Titre

Comment puis-je accomplir cela?

Atma
la source

Réponses:

223

Il semble que vous souhaitiez que le titre de la barre de navigation change mais pas celui de la barre d'onglets. Cela devrait faire cela.

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

Rapide:

self.navigationItem.title = "My Title"
Craig Siemens
la source
1
Assurez-vous, si vous utilisez toujours self.title pour définir votre titre uitabbar, de définir self.navigation setTitle après, sinon cela ne fonctionnera pas
simon_smiley
2
dans xcode 9 et ios 11 dans swift 4, il montre une erreur que l'utilisation sans ambiguïté du titre
Sushobhit
1
Travailler pour moi dans Xcode 10.2 en utilisant Swift 4.2, merci beaucoup!
jangelsb
174

Donc pour ceux qui ne comprennent toujours pas (comme moi)

self.navigationItem.title = @"my title";définit le titre de la barre de navigation .

self.tabBarItem.title = @"my title";définit le titre de la barre d'onglets .

self.title = @"my title";définit les deux .

Simon Epskamp
la source
20

Rapide

Définir le titre de la barre supérieure

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

Définir le titre de l'élément d'onglet

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

Définir les deux titres

self.title = "both titles"
Suragch
la source
Qu'est-ce que c'est topItem?
imike le
2
C'était la seule façon dont je pouvais définir le titre de ma barre supérieure dans ma configuration, je ne sais pas pourquoi "self.navigationItem.title" ne fonctionnait pas pour moi.
JohnnyC
7

Pour Swift, utilisez ceci,

self.navigationItem.title = "Navigation bar title" 
self.title = "Tab bar title"
Mohammad Zaid Pathan
la source
dans xcode 9 et ios 11 dans swift 4 (self.navigation.title) montrant une erreur qui utilise sans ambiguïté le titre
Sushobhit
6

Remarque: Si vous avez un contrôleur de barre d'onglets avec des contrôleurs de navigation à la racine de chaque contrôleur de vue, la définition de l'élément de barre d'onglets sur les contrôleurs de vue n'affectera pas le titre si vous définissez le navigationItem.title. Vous devrez tabBarItemplutôt définir le sur le contrôleur de navigation pour qu'il soit récupéré à partir du contrôleur de la barre d'onglets.

Aucune des réponses publiées par d'autres n'a fonctionné pour moi parce que les contrôleurs de vue de ma barre d'onglets ont tous des contrôleurs de navigation à leur racine - c'est un modèle de hiérarchie courant pour UITabBarController. Vous devez définir le contrôleur de navigation à la tabBarItemplace pour que le titre s'affiche différemment du navigationItemtitre du.

Vous pouvez créer vos tabBarItemet les associer directement à votre VC comme tel.

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

    tabBarViewControllers.append(tabBarVCOne)
    ...

Ensuite, vous aurez quelque chose comme ça:

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

Mais cela devrait être changé comme suit afin de récupérer le déjà associé tabBarItemdu contrôleur de vue et de le définir automatiquement sur le contrôleur de navigation.

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

Vous pourrez maintenant avoir un titre différent (défini à partir de votre VC) séparé du titre défini pour votre tabBarItem.

Pavan
la source
0

Assez tard pour cela. Vous pourriez avoir votre TabBarController servir de UITabBarControllerDelegate et UINavigationControllerDelegate pour lui-même et les contrôleurs de navigation incorporés dans chacun de vos onglets respectivement.

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

Sur la base de quelques tests rapides, il semble que ces deux actions de délégué devraient couvrir tous les cas lâches et mettront à jour le titre que vous changiez d'onglet ou que vous naviguiez dans votre contrôleur de navigation. Pour être complet, vous pouvez également mettre à jour votre titre dans didShowViewController , mais d'après ce que j'ai vu, je ne pense pas que ce soit nécessaire.

Ruiz
la source
0

Probablement un peu tard (mais).

La définition du titre d'un VC change le titre de la navigation ET de la tabBar. (si le VC est déjà attaché aux deux).

Si vous souhaitez avoir des titres séparés, vous devez les définir manuellement, vous définissez normalement le titre du VC, puis spécifiquement le titre du tabBarItem, car il s'agit d'une propriété du

Wolffan
la source
0

Swift 4.2

Voilà, j'ai créé une extension pour 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
 }

}

Et puis depuis votre manette:

override func viewDidLoad() {
    super.viewDidLoad()
    setTitles(navigationTitle: "Login", tabBarTitle: "Home")
}
cs4alhaider
la source