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?
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
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".
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".
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
.
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)
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. :(
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";
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.
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).
Passez ensuite à attribute inspector
sur le panneau tilitaires.
Vous pouvez maintenant tout changer :-)
Swift 4 +
tabBarController?.tabBar.items![1].title = "xx"
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;
}
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];
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"];