web-dev-qa-db-fra.com

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

Je mets en place mon titre de contrôleur de vue comme celui-ci vu:

self.title = @"my title";

avant cela, je définissais le titre dans les story-boards du contrôleur de vue et du contrôleur de navigation dans lequel il est intégré.

Lorsque je clique sur l'onglet contenant le contrôleur de vue, le titre de l'élément de la barre d'onglets et uiviewcontroller deviennent: mon titre.

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

Comment puis-je accomplir cela?

80
Atma

Il semble que vous souhaitiez que le titre de la barre de navigation change mais pas celui de la barre de tabulation. Cela devrait faire ça.

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

Rapide:

self.navigationItem.title = "My Title"
166
Craig Siemens

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

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

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

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

142
Simon Epskamp

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 de l'onglet

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

Définir les deux titres

self.title = "both titles"
10
Suragch

Pour Rapide utilisez ceci,

self.navigationItem.title = "Navigation bar title" 
self.title = "Tab bar title"
7
Zaid Pathan

Remarque: Si vous avez un contrôleur de barre d’onglet avec des contrôleurs de navigation à la racine de chaque contrôleur de vue, la définition de l’élément de barre de tabulation sur les contrôleurs de vue n’affectera pas le titre si vous définissez le navigationItem.title. Vous devez définir la variable tabBarItem sur le contrôleur de navigation à la place pour qu'elle soit prise dans le contrôleur de la barre d'onglets.

Aucune des réponses postées par d'autres n'a fonctionné pour moi, car les contrôleurs de vue de ma barre d'onglets ont tous des contrôleurs de navigation à la racine. Il s'agit d'un modèle de hiérarchie commun pour UITabBarController. Vous devez définir la variable tabBarItem du contrôleur de navigation à la place pour que le titre s'affiche différemment du titre de la variable navigationItem.

Vous pouvez créer votre tabBarItem et les associer directement à votre VC. 

    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 la tabBarItem déjà associée dans le contrôleur de vue et de la 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

5
Pavan

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 ensuite de votre contrôleur:

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

Probablement un peu tard (mais).

Définir le titre d'un VC modifie le titre de la navigation ET du tabBar . (Si le VC est déjà associé aux deux).

Si vous voulez avoir des titres séparés, vous devez les définir manuellement. Vous devez normalement définir le titre pour le VC, puis précisément le titre du tabBarItem, car il s'agit 

0
wolffan

Je crois en la méthode viewDidLoad du contrôleur de vue que vous pouvez faire:

self.title = @"my title";
self.tabBarItem.title = @"tab title";
0
rmaddy

Assez tard pour ça. Vous pouvez utiliser votre TabBarController en tant que UITabBarControllerDelegate et UINavigationControllerDelegate pour lui-même et les contrôleurs de navigation intégré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 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 mettre à jour votre titre dans didShowViewController également, mais, d’après ce que j’ai vu, je ne pense pas que ce soit nécessaire.

0
Ruiz