web-dev-qa-db-fra.com

Changer le nom de l'onglet dans uitabbarcontroller

J'ai un TabBarController défini comme onglet de contrôleur principal, où les noms ont été définis à l'aide du générateur d'interface. Maintenant, je voudrais changer ses noms par programme.

Comment pourrait-on le faire?

34
Ruth85

Mis à jour vers XCode 8

Depuis ma réponse d'origine, il s'est passé beaucoup de choses: Swift 3, Storyboards, etc. Le titre est généralement celui que toutes les vues partagent et peut être défini dans l'inspecteur d'attributs

Title Setup

De plus, pour plus de contrôle, vous pouvez toujours faire glisser les éléments UITabBarItem et UINavigationItem depuis la vue du concepteur. Vous devez les faire glisser vers la vue qui sera affichée dans la barre d'onglets/le contrôleur de navigation. Fondamentalement, ils stockent les informations sous la forme "Je veux être affiché dans la barre d'onglets comme ceci".

enter image description here

Hello Scene reçoit un TabBarItem ajouté, il peut donc être configuré.

Ces deux éléments se comportent exactement comme l'accès aux propriétés .tabBarItem Et .navigationItem Du contrôleur de vue via le code. Ces propriétés existent toujours dans le code si elles sont enfants de l'objet correspondant (nav a navItem et tab a tabItem), vous n'avez pas besoin de les ajouter dans storyboard/xib pour les avoir.

Cette dernière chose est un peu déroutante, car dans le storyboard/xib, il semble que vous les ajoutiez au contrôleur de vue, mais en vérité, vous dites simplement que "la plume configurera également ces propriétés".

Réponse originale

Le nom qui apparaît dans la barre d'onglets provient de la propriété UIViewController de title,

self.title = @"Name me!";

Vous pouvez modifier le titre à tout moment et il doit mettre à jour le texte apparaissant sur l'élément de la barre d'onglets. Mais méfiez-vous, faites-le dès que possible , idéalement, dans la méthode init utilisée (ou initWithNibName:bundle: ou initWithCoder:).

La clé ici, c'est que les méthodes init sont appelées dès que la barre d'onglets apparaît à l'écran, car elle initialise tout son contrôleur de vue. Si vous deviez le faire sur viewDidLoad, cela ne serait appelé que si vous sélectionnez réellement l'onglet, puis une autre famille d'appels, il en va de même pour awakeFromNib, viewWillAppear:, viewDidAppear:, Etc.

L'idée d'avoir un titre sur le UIViewController, c'est de garder les choses cohérentes. Si vous affichez ce viewController sur un UINavigationController, la barre de navigation en haut doit utiliser la propriété title, comme lors de l'utilisation de back. UITabBarController respecte également la même propriété title et change en conséquence.

En termes de réutilisabilité, vous devez définir le titre uniquement depuis l'intérieur de la sous-classe UIViewController.

Le chemin de la plume

Vous utilisez des plumes ou des storyboards? Si vous avez un UIViewController, vous pouvez lui donner le nom directement dans l'inspecteur d'attributs (ou 4)

Using interface builder, in the Attributes Inspector

Malheureusement, si le propriétaire du fichier est la sous-classe UIViewController, vous ne pourrez pas y accéder de cette façon, tout simplement parce que, XCode enregistre le propriétaire du fichier comme un "objet externe" et n'affiche pas de panneau de configuration pour cela. :(

Plusieurs titres, même contrôleur de vue

Mais parfois, vous voulez juste les nommer différemment

// Modify the display title on the tab bar
self.tabBarItem.title = @"World";

// Modify the display title on the navigation bar
self.navigationItem.title = @"Hello World";

Vissage avec les voisins

Chaque UIViewController doit gérer son propre nom, que se passe-t-il si vous voulez le forcer de l'extérieur (et donc violer complètement ce que j'ai dit à propos de la réutilisabilité)?

// Rename the other guy's .title property
[[self.tabBarController.viewControllers objectAtIndex:<#Index#>] setTitle:@"Hello World"];

// Or do as before, and rename the other guy's tab bar 
[(UITabBarItem*)[self.tabBarController.tabBar.items objectAtIndex:<#index#>] setTitle:@"Hello World"];

Vous pourriez aussi probablement le faire avec l'élément de navigation, mais cela nécessiterait plus de gymnastique que je ne suis à l'aise.

44
Can

Cependant, il est possible de le faire en code, il est préférable de le définir directement dans Storyboard. Comment?

Appuyez simplement sur l'élément de barre d'onglets approprié à l'intérieur du contrôleur (PAS À L'INTÉRIEUR DU CONTRÔLEUR DE TABBAR).

enter image description here

Passez ensuite à attribute inspector sur le panneau tilitaires.

enter image description here

Vous pouvez maintenant tout changer :-)

32

Swift 4 +

tabBarController?.tabBar.items![1].title = "xx"
5
Alfi

Dans votre viewController.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
  //Here you are setting title

self.title = NSLocalizedString(@"Title", @"Title");

}
return self;
}
2
user1587244

Voici comment changer le nom et l'image de l'icône d'une barre d'onglets:

 self.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Main Tab" image:[UIImage imageNamed:@"maintab.png"]] autorelease];
1
TommyG

Vous souhaiterez probablement le faire dans UITabBarController :: viewDidLoad, auquel cas vous devez définir le titre du contrôleur de vue car les éléments de la barre d'onglets sont actuellement à 0 à ce stade. Alors utilisez

[[self.viewControllers objectAtIndex:0] setTitle: @"Buga"];
[[self.viewControllers objectAtIndex:1] setTitle: @"Nuga"];
1
RelativeGames