# Changer titre back button nav bar



## Coolsinus (19 Mars 2012)

Salut tout le monde !

Je suis actuellement en train de développer mon application et je souhaite customiser l'apparence de celle-ci. Pour cela, j'ai changé le background de la navigation bar, le back button de la navigation bar, changé les boutons, changé le background de la tab bar, etc.

Mon application comporte une tableView qui mène, selon la cellule sur laquelle on clique, à de nombreuses view, organisés sous forme de tab bar.

Comme je vous le disais plus tôt, j'ai remplacé mon back button par un autre, sous forme d'image, sur lequel il y a écrit "Back". Le problème est que celui-ci, qui fait retourner l'utilisateur à ma tableView, prend le nom de la tableView, soit "Categories". Donc "Categories" vient se placer sur le titre "Back" de mon back button customisé, et...c'est moche, très moche ! 

Tout cela pour demander, comment retirer le "Categories" qui vient gâcher mon magnifique bouton ? 

Merci d'avoir prit le temps de lire ce pavé, et merci d'avance ! 

Ps : J'utilise le Storyboard


----------



## Nyx0uf (19 Mars 2012)

Tu crées un custom UIBarButtomItem, tu lui met le titre que tu veux et tu le mets à la place du back button


----------



## Coolsinus (19 Mars 2012)

Merci mais je fais comment au juste ?

Voici mon code dans le fichier AppDelegate.m : 
	
	



```
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"nvgbar.png"] forBarMetrics:UIBarMetricsDefault];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:[UIImage imageNamed:@"BackButt.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [[UITabBar appearance] setBackgroundImage:[UIImage imageNamed:@"tabbar.png"]];
    
    
    return YES;
}
```


----------



## Nyx0uf (20 Mars 2012)

```
UIBarButtonItem* button = [[UIBarButtonItem alloc] initWithTitle:@"L'Actu" style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.backBarButtonItem = button;
[button release];
```


----------



## Coolsinus (20 Mars 2012)

J'ai mis ça dans la méthode _- (BOOL)applicationUIApplication *)application didFinishLaunchingWithOptionsNSDictionary *)launchOptions {}_ et dans la méthode _- viewDidLoad{}_, aucun des deux ne marche...:rateau:

Quand je le met dans _- (BOOL)applicationUIApplication *)application didFinishLaunchingWithOptionsNSDictionary *)launchOptions {}_ Xcode me signale deux erreurs : la premiere : self.navigationItem n'existe pas pour un type d'objet AppDelegate. Enfin, depuis iOS5, il existe l'automatic reference counting mode, ainsi [button release] crée une erreur mais c'est pas ça l'important, c'est surtout le fait que navigationItem n'existe pas pour AppDelegate...

Fais-je une erreur ou bien le code est-il erroné ?

EDIT : Voila une image du back button pour vous aider à m'aider :

Comme vous le voyez, "Categories" vient se glisser automatiquement sur mon image...


----------



## Coolsinus (22 Mars 2012)

Personne ?


----------



## Rez2a (24 Mars 2012)

Je vois pas trop ce que le appDidFinishLaunchingWithOptions: vient faire là-dedans ?

Il faut faire ça dans le UIViewController qui gère ta UITableView "Catégories".

De la même façon que c'est lui qui va gérer le titre affiché dans ton UINavigationController (tu dois bien appeler [self.navigationItem setTitle"Catégories"] quelque part ?), il faut mettre le code du backButtonItem à la suite.


----------



## Coolsinus (24 Mars 2012)

Eh bien DidFinish... c'est là où j'ai vu que l'on customise, ainsi j'ai changé ma tabBar, navigationBar etc...donc je pensais que c'etait là que je pouvais supprimer le titre automatique qui vient se placer sur mon backButton.

Moi ma tableView je l'ai faites à la main, c'est-a-dire que j'ai créé ma tableView cellules par cellules ainsi, j'ai également changé le nom de ma tableView en double cliquant sur la partie bleutée de ma tableView.


----------



## Rez2a (24 Mars 2012)

Aie...

Bon je suis pas expert en nouveautés d'iOS 5, mais dans le didFinish, tu peux customizer l'apparence de tes UITabBar et autres parce que ce sont des méthodes de classe (un [UITabBar appeareance], ça ne concerne pas de TabBar en particulier, donc ça concerne toutes les TabBar de l'appli).

En ce qui concerne les UITableView, c'est autre chose.

Elles sont censées être contenues dans des UIView, qui sont gérées par des UIViewController, et les données qu'elles affichent sont censées être récupérées depuis des méthodes liées au protocole UITableViewDataSource, que doit implémenter ton UIViewController.

Quant au titre de navigation (le "Catégories" dans la barre bleue), ça n'a encore rien à voir avec la TableView, c'est le titre que possède le UINavigationController à un instant t, mais ça n'est pas lié à une UITableView ; cependant, c'est bien le UINavigationController qui t'intéresse puisque c'est avec lui que tu vas définir le bouton retour qui apparaît.

Bref, que dire à part que je sais pas trop comment tu procèdes... l'édition des cellules de ta TableView et du titre de ton NavigationController, tu les fais où exactement dans Xcode ?


----------



## Coolsinus (24 Mars 2012)

D'accord, d'accord...
Eh bien la manière dont je procède est très simple : je crée une tableViewController en "dragant" une des petites icônes en bas à droite de la fenêtre Xcode sur le canevas "Storyboard". Ensuite j'ajoute autant de cellules que je souhaite que ma tableView contienne en "dragant" dessus une icône "table View Cell". Je clique sur ma cellule, lui donne le style "Basic" dans l' "Attributes editor". Je double-clic sur ma cellule, lui donne un nom, puis je maintiens Ctrl, je relie ma cellule à un tabBarController ou une vue, peu importe, et le tour est joué  J'utilise cette manière car je la trouve bien bien plus facile qu'utiliser un ensemble de méthodes pour faire tout ca 

Voili voilou j'espère que ça t'éclaireras et ainsi pourras-tu m'éclairer


----------



## Rez2a (24 Mars 2012)

Désolé mais je ne vais pas pouvoir t'aider, je ne connais pas du tout les Storyboards ni la manière de laquelle c'est géré...
Cela dit ça me paraît quand même obligé que tu doives créer des UIViewController pour gérer tout ça, le drag and drop c'est pratique mais si il y a des protocoles avec des méthodes associées à inclure dans les controllers ce n'est pas pour rien


----------



## Coolsinus (24 Mars 2012)

Il y a un navigationController pour la tableView. Que dois-je faire ? Faut-il que je crée un fichier UITableViewController auquel je relie ma tableView pour ainsi insérer des méthodes me permettants de me débarrasser de "Categories" ?


----------



## Coolsinus (7 Avril 2012)

Je suis toujours coincé, personne ?


----------



## Coolsinus (11 Avril 2012)

J'ai trouvé la réponse, mais j'ai encore un problème ! Il fallait que je crée un fichier UITableViewController lié à ma TableView et mettre dans la méthode viewDidLoad le code suivant : 
	
	



```
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"JeMetCeQueJeVeux" style:UIBarButtonItemStylePlain target:nil action:nil];
```

Sauf que lorsqu'on mets ce code, le bouton retour disparait :

```
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
```

Et quand je mets ce code, le bouton apparait mais une sorte de brique transparente vient se glisser entre "B" et "ack" de la même manière que "Categories" (voir image jointe) :


```
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStylePlain target:nil action:nil];
```

Voila ce que ca donne  : 
Merci d'avance


----------



## Nyx0uf (11 Avril 2012)

Ce qui revient au code que j'ai posté le 20 mars


----------



## Coolsinus (11 Avril 2012)

Ahahahah ! Tu m'as tué ! 
Oui mais tu ne m'avais pas dis où le mettre ! 

Mais j'ai encore un petit problème, et celui-ci est que comme dans l'image montrée, il y a une brique transparente qui vient se glisser...
Une idée, que je chercherais un peu plus à faire marcher ? 

Merci


----------



## Coolsinus (12 Avril 2012)

J'ai trouvé !   J'ai crée un fichier de type UITabBarController, dans le fichier .m j'ai mis ton code :


```
- (void)viewDidLoad
{
    [super viewDidLoad];
    UIButton *backButt = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 86, 31)]; //tes dimensions de l'image
    [backButt setImage:[UIImage imageNamed:@"BackkkButt.png"] forState:UIControlStateNormal];
    [backButt addTarget:self action:@selector(popViewController) forControlEvents:UIControlEventTouchDown];//il faudra définir une fonction de retour
    UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButt];
    self.navigationItem.leftBarButtonItem = backButtonItem;//on remplace le bouton en haut à gauche
}

-(void)popViewController {
    //fonction de retour à la vue précédente
    [self.navigationController popViewControllerAnimated:YES];
}
```


J'ai relié mes Tab Bar Controlleur qui gérent les différentes vues organisées sous forme de TabBar à mon UITabBarControlleur et BOUM ! Ça marche !


----------



## Rez2a (12 Avril 2012)

Le problème dans tout ça c'est que ça donne l'impression que tu sais pas trop ce que tu fais... 

Mais bon, maintenant que tu as réglé ton souci au niveau technique (on progresse en tâtonnant hein c'est normal ), pose-toi les questions suivantes :

- Si j'ai bien compris, "Back" est écrit en dur dans ton image, d'où le fait que tu ne voulais pas que le titre apparaisse ; c'est pas embêtant que le titre de ce button item reste en anglais alors qu'il y a un mécanisme de localisation qui existe ?
- Si sur un des controllers de ton appli, tu veux mettre autre chose que "Back" sur le bouton retour, tu fais comment ?
- Est-ce qu'il y a une application d'Apple où le titre d'un backButtonItem est "Back" ou "Retour" ? (Je me mouille un peu, mais de mémoire, le seul backButton qui n'a pas un titre "explicite" est celui d'iTunes lorsqu'on est en train de lire un morceau, et le titre n'est même pas "Retour", mais c'est une flèche vers la gauche)
- Pourquoi le système est fait de sorte à ce que le backButtonItem affiche le titre du controller précédent dans la hiérarchie par défaut ?

Tout ça pour dire que c'est peut-être un détail ce backButtonItem, mais ce sont les détails qui font les bonnes applis ; et un bouton "Back" uniforme sur tous les controllers n'est pas une bonne solution, simplement parce que l'utilisateur est perdu lorsqu'il voit ça.
Dans une utilisation normale ça ne gêne pas bien sûr, tout le monde connaît le principe du bouton retour en haut à gauche.
Mais dans le cas où l'utilisateur revient sur ton appli après, disons, 30 minutes passées à utiliser une autre appli, et qu'il atterit sur ton appli déjà ouverte à un endroit donné, avec un controller affiché (peu importe lequel), et qu'il voit un bouton "Back" en haut à gauche ; est-ce qu'il se souvient du controller sur lequel il va revenir en appuyant sur ce bouton, ou est-ce que c'est pas plus explicite de garder le titre du controller précédent comme titre de ce bouton pour qu'il s'en rappelle ?

C'est con en plus parce que j'étais tombé sur un très bon article qui expliquait bien le problème y a même pas un mois. 

Un exemple tout bête, celui de l'application Mail d'Apple sur iOS : si tu as plusieurs comptes mails configurés, lorsque tu es dans la boîte de réception de l'un deux, tu connais le compte mail auquel tu es en train d'accéder car le backButtonItem porte le titre de ce compte ; ça sera "Gmail" ou "Hotmail" ou n'importe quoi d'autre, mais si il était juste défini comme "Retour", tu ne saurais jamais quel compte tu es en train de regarder en accédant à l'appli Mail.


----------



## Coolsinus (12 Avril 2012)

Bonjour,
Oui, j'ai trouvé en tâtonnant c'est vrai, en même temps c'est ma première application et j'en ai appris beaucoup sur les ViewControllers durant la création de celle-ci.

- Toute mon application a été rédigé en anglais, j'envisage d'y mettre un switch où on peut choisir anglais/français mais cela voudrait dire que je dois faire de tous mes Labels et de tous mes TextField, Buttons etc des outlets d'où je pourrais changer le nom, l'image (sur laquelle est écrit du texte) etc, et ça s'annonce très long et fastidieux, à moins que tu ne connaisses une autre méthode, dans quel cas je suis preneur ! En ce qui concerne le mécanisme de localisation, je ne sais pas m'en servir.

- Eh bien je ferais un nouveau UITabBarController et je l'appliquerais à la partie dont je veux effectuer le changement.

- En ce qui concerne le nom de mon bouton retour, c'est une longue histoire. À la base, je voulais simplement changer l'apparence de mon bouton retour, et donc j'ai eu l'idée de mettre "Back" dessus. Je n'avais aucune idée de comment le changer mais l'image a été crée néanmoins. Puis il y a quelques jours, j'ai trouvé comment changer le titre, sauf que lorsque je laissais "Categories", et que je mettais mon bouton perso vierge, Xcode allongeait inutilement mon bouton et ça n'était pas esthétique. D'autant plus qu'en conséquence le titre en haut de mes vues était decalé, et donc décentré. 
Voilà pour la petite histoire...Je vois bien ce que tu veux dire, c'est plus ergonomique, donc j'ai remis "Categories" sur mon l'image de mon bouton, problème réglé : beau bouton + titre en accord avec le reste de l'application.


----------



## Rez2a (13 Avril 2012)

Pour la localisation :

- Pas besoin de switch anglais/français, le système est justement fait de sorte à ce que les applis disposant de plusieurs localisations affichent les textes ou images dans la langue du téléphone.
En gros, tu vas te retrouver avec plusieurs fichiers de langues (un pour chaque langue) dans lesquels tu mettras les correspondances de chaînes, et tu utilises des NSLocalizedString pour afficher les chaînes présentées à l'utilisateur.

Exemple con, si tu disposes d'un fichier de localisation anglais dans lequel tu écris "Bonjour" = "Hello", et que définis le texte d'un UILabel avec [label setText:NSLocalizedString(@"Bonjour", @"")], le texte du label sera "Hello" si le téléphone est en anglais, ou "Bonjour" si le téléphone est dans une autre langue.

Pour l'histoire du UITabBarController, je comprends toujours pas le rapport puisque c'est la classe qui gère ta UITabBar de l'appli, c'est un peu sale de sous-classer juste pour changer les titres de tes controllers.
Je pense que tu devrais vraiment approfondir tes connaissances sur les classes les plus utilisées dans le framework, et sur les mécanismes de gestion des controllers, lesquels font quoi, où se définit tel truc, etc. 
À mon avis, se jeter dans les Storyboards et trifouiller au hasard jusqu'à ce que ça marche, c'est un très mauvais réflexe. De la même façon que tu utilises sûrement ARC au lieu de gérer la mémoire "à la main" (corrige-moi si je me trompe), c'est pas forcément la meilleure des choses, c'est chiant à apprendre mais ça permet de comprendre bien des trucs, surtout que je doute beaucoup de l'infaillibilité de ARC.

Enfin pour les backButtonItems, effectivement ils peuvent être resizés automatiquement en fonction du titre du controller précédent, ce qui implique un recentrage du titre du controller actuel.
Libre à toi de trouver ça moche, mais tu aurais simplement pu, justement, définir le titre de ton backButtonItem à la main pour le passer à "Cat.", de façon à ce que ça reste compréhensible et que ça modifie pas la disposition des éléments dans la navigationBar.


----------



## Coolsinus (14 Avril 2012)

Merci pour tes explications  

Je vais chercher à en apprendre plus sur les NSLocalizedString et comment faire marcher tout ça.
En ce qui concerne les ViewController et UITabBarController etc j'ai cherché des tutoriels mais c'est vraiment difficile de trouver quelque chose de qualiteux...
Il y a des dizaines de tutoriels pour passer d'une vue à l'autre par contre dès qu'on cherche à faire quelque chose d'un peu plus sioux ya rapidement plus grand chose sur le sujet.

Par exemple moi là je voudrais créer un UIBarButtonItem sur la Navigation Bar d'une seule vue qui fait partie d'une série de vues organisées dans un Tab Bar (je ne pense pas utiliser le bon vocabulaire mais je ne sais comment expliquer d'une autre maniere : je met une image en lien). Sauf que je ne peux pas ajouter de UIBarButtonItem directement sur la Navigation Bar de cette vue, il faut que je l'ajoute sur la Navigation Bar de mon Tab Bar Controller... ou alors je peux, sauf que il faut que je glisse et dépose sur la Navigation Bar de la vue un Navigation Item puis un Bar Button Item. Sur le storyboard le bouton est présent, sauf que quand je compile et lance le Simulateur, alors celui-ci disparait !

Un autre problème survient : quand bien même je met mon Bar Button Item sur la Navigation Bar de mon Tab Bar Controller, quand je relie mon bouton à une vue lorsqu'on appui sur ce dernier, ça marche, mais quand je rajoute une Navigation Bar et un Bar Button Item sur la Third View pour ensuite revenir à la vue de laquelle on a cliqué sur le bouton, eh bien ce lien fait disparaitre la Navigation Bar et la Tab Bar de cette vue (Second View voir image).

Tous ces problèmes, je ne trouve guère de solution sur le web, ce qui me force à trifouiller sans arrêt...

Bon voila l'image en lien : Tu vois l'organisation et tu vois que la Second View de mon Tab Bar Controller est blanche à cause du lien qui ramène la Third View à la Second View car j'ai ajouté manuellement la Navigation Bar à la Third View...Bon bref je comprend pas grand chose de comment ça fonctionne tout cela si tu pouvais m'éclairer je t'en serais grandement reconnaissant.

Coolsinus :rateau:


----------

