Changer titre back button nav bar

Coolsinus

Membre actif
19 Août 2010
369
14
Paris
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 ! :D

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 :)
 
Merci mais je fais comment au juste ?

Voici mon code dans le fichier AppDelegate.m :
Bloc de code:
- (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;
}
 
Dernière édition:
J'ai mis ça dans la méthode - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {} et dans la méthode - viewDidLoad{}, aucun des deux ne marche...:rateau:

Quand je le met dans - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)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...
 
Dernière édition:
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.
 
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.
 
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 ?
 
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 ;)
 
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 ;)
 
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" ?
 
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 :
Bloc de code:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"JeMetCeQueJeVeux" style:UIBarButtonItemStylePlain target:nil action:nil];

Sauf que lorsqu'on mets ce code, le bouton retour disparait :
Bloc de code:
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) :

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

Voila ce que ca donne :( :
Merci d'avance :)
 
Ahahahah ! Tu m'as tué ! :D
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 ? :D

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

Bloc de 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 ! :D
 
Le problème dans tout ça c'est que ça donne l'impression que tu sais pas trop ce que tu fais... :D

Mais bon, maintenant que tu as réglé ton souci au niveau technique (on progresse en tâtonnant hein c'est normal :p), 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.
 
Dernière édition:
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.:up:
 
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. :)