web-dev-qa-db-fra.com

Attribut Titre UIViewController dans le scénarimage

Je configure le champ de titre d'une UIViewController via Interface Builder/Storyboard: enter image description here

Ce contrôleur de vue est imbriqué dans une UINavigationController qui, à son tour, est imbriquée dans une UITabBarController. Lorsque je lance l'application, mon élément de navigation n'a pas de titre, ni l'élément de la barre d'onglets. 

Si je définis explicitement le titre de l'élément de navigation du contrôleur de vue, ainsi que le titre de l'élément de la barre d'onglets dans le générateur d'interface, cela fonctionne parfaitement.

Je me demande:

a) Si je n'utilise pas Storyboard mais juste xibs, définir le titre d'un contrôleur de vue définit implicitement le titre des éléments de navigation ainsi que celui de l'élément de la barre d'onglets. Mais ce n'est pas la même chose storyboard. Est-ce le comportement prévu?

b) Quel est alors le but du titre du contrôleur de vue (dans Storyboard)? cela semble n'avoir aucun effet.

Merci!

36
0xSina

Vous pouvez définir le titre de la variable UINavigationBar dans Storyboard en double-cliquant sur la barre de navigation réelle et en tapant un titre à cet endroit. Ceci ne définit que le titre de la variable UINavigationBar.

La définition du titre dans le code offre différentes possibilités.

self.title = @"Your title"; définira le titre d'une barre de navigation et provoquera également la cascade du titre vers un UITabBarItem, s'il est présent.

self.navigationItem.title = @"Your title"; définira uniquement le titre de la barre de navigation, en supposant qu'un UINavigationController est présent, et n'affectera PAS un UITabBarItem.

self.navigationController.title = @"Your title"; définira le titre d'un UITabBarItem mais PAS le UINavigationBar.

23
hgwhittle

Étape 1

Si vous regardez un Xib dans Interface Builder de Xcode, regardez dans le panneau "Structure du document" (deuxième panneau à partir de la gauche). Développez le contrôleur de vue que vous utilisez jusqu'à ce que vous trouviez une icône intitulée: Élément de navigation.

Document Outline panel showing Navigation Item

Étape 2

Si vous sélectionnez ensuite l'élément de navigation, ouvrez le panneau Utilitaires (le plus à droite) et cliquez sur l'inspecteur d'attributs, vous verrez où vous pouvez définir le titre du contrôleur de vue. C’est la manière de le faire dans Interface Builder, plutôt que de le faire avec du code.

Utilities panel showing how to set title of view controller

18
Mario

J'ai rencontré ce problème ce matin. Voici les coups de couteau que j'ai pris et la solution de contournement finale.

Ceci enregistre correctement le titre du contrôleur de vue enfant tel qu'il est défini dans le storyboard, mais n'a aucun effet sur ce qui est présenté:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"Title: %@", self.title);
}

Cela n'a aucun effet. le titre ne s'affiche toujours pas (probablement en faisant un utilisateur "if (! [_ title isEqualToString: title]) {}" {} "

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = [self.title copy];
}

Cela provoque le titre pour être correctement défini:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *title = self.title;
    self.title = nil;
    self.title = title;
}

Mon hypothèse est que UINavigationController tire le titre de la vue présentée avant son chargement dans le storyboard, mais ne commence alors pas à écouter les modifications avant la définition de la propriété. Cependant, je n'utilise pas très souvent des storyboards ou des plumes. Il est donc tout à fait possible qu'il y ait une case à cocher magique pour cet endroit caché que j'ai raté.

Dans tous les cas, il semble que vous puissiez effectuer la solution self.navigationItem.title = self.title ou la procédure ci-dessus tout en conservant vos titres dans IB.

Les documents relatifs aux pommes pour cela sont un peu clairs:

Le contrôleur de navigation met à jour le milieu de la barre de navigation en tant que suit:

  • Si le nouveau contrôleur de vue de niveau supérieur a une vue de titre personnalisée, la barre de navigation affiche cette vue à la place de la vue de titre par défaut . Pour spécifier une vue de titre personnalisée, définissez la propriété titleView de la vue élément de navigation du contrôleur.

  • Si aucune vue de titre personnalisée n'est définie, la barre de navigation affiche une étiquette contenant le titre par défaut du contrôleur de vue. La chaîne pour cela label est généralement obtenu à partir de la propriété title de la vue contrôleur lui-même. Si vous souhaitez afficher un titre différent de celui du fichier l'un associé au contrôleur de vue, définissez la propriété title du visualisez l’élément de navigation du contrôleur.

L'accent est à moi.

3
Justin Middleton

Je viens de rencontrer le même problème. Je ne comprends pas pourquoi ça ne marche pas ... Ça peut être fait exprès ou tout simplement être un bug.

Pour modifier le titre dans le générateur d'interface, vous pouvez cliquer directement sur l'élément de navigation et modifier le titre à cet endroit:

enter image description here

2
Julian F. Weinert

Si vous avez UINavigationItem, vous devez alors utiliser le titre de l'élément de navigation dans le storyboard. Si vous n'avez pas d'élément de navigation pour un contrôleur de vue, la variable UINavigationController utilisera la propriété title du contrôleur de vue.

Exemple : Here are 2 examples

Dans votre storyboard, si vous avez un élément de navigation, le contrôleur de navigation n'a pas besoin de lire le titre du contrôleur de vue. Même si le champ de titre est vide pour cet élément de navigation.

Supprimez l'élément de navigation (si vous le pouvez, vous ne pourrez pas le faire pour le contrôleur de vue racine mais vous le ferez pour les autres) et votre titre sera correctement chargé.

1
mbritto

Tout le reste sur cette page a échoué. Pour l'instant, cela fonctionnait, en code, dans viewDidLoad:

NSString* text = @"My page title";
UIFont* font = [UIFont systemFontOfSize:20.0];
const CGSize SIZE = [text sizeWithAttributes:@{NSFontAttributeName:font}];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, SIZE.width, SIZE.height)];
label.text = text;
label.textColor = UIColor.blackColor;
self.navigationItem.titleView = label;
1
Jonny

J'ai essayé toutes les méthodes ci-dessus, et même essayé d'ajouter manuellement une barre de navigation, mais en vain.

C'est donc ce qui a fonctionné pour moi.

Supprimez tout élément de la barre de navigation que vous avez ajouté manuellement au contrôleur de vue et ajoutez-le à votre méthode viewDidLoad.

self.navigationController.navigationBar.topItem.title = @"My Title";

ou

self.navigationController.topViewController.title = @"My Title";
0
Bryan P

Dans mon cas, je résous avec ceci:

    [self.tabBarController.navigationItem setTitle:@"My Title"];
0
Julian Corrêa

a) Si je n'utilise pas Storyboard mais uniquement des fichiers xib ordinaires, la définition du titre d'un contrôleur de vue définit implicitement le titre des éléments de navigation ainsi que le titre de l'élément de la barre d'onglets. Mais ce n'est pas le même storyboard. Est-ce le comportement prévu?

Je crois que c'est le comportement prévu. Je pense que l'objectif de l'attribut title d'un contrôleur de vue est davantage une propriété qui peut être utilisée à la discrétion du développeur, peut-être pour distinguer les contrôleurs. 

Je pense qu'une autre raison de ce changement est que le titre de votre élément de navigation peut avoir besoin d'être différent du titre de la barre d'onglets, car son titre ne peut pas être aussi long que le titre de la navigation.

b) Quel est alors le but du titre du contrôleur de vue (dans Storyboard)? cela semble n'avoir aucun effet.

Je pense en avoir parlé dans mon premier paragraphe. Je pense que l'attribut title d'un contrôleur est une propriété que le développeur peut utiliser pour peut-être distinguer les contrôleurs.

0

Je pense que cela fonctionne comme prévu bien que nous attendions un autre comportement. Si vous imprimez la propriété title dans - (void) viewDidLoad ce sera la même valeur que celle que vous avez définie dans le story board. Je ne vois donc aucune raison pour que cela ne fonctionne pas, à moins que Apple ne choisisse.

0
Raphael Oliveira