Comment changer le titre du bouton «retour» sur une barre de navigation

224

Actuellement, la valeur par défaut du bouton de la barre de gauche est le titre de la vue qui a chargé la vue actuelle, c'est-à-dire la vue à afficher lorsque le bouton est enfoncé (bouton de retour).

Je veux changer le texte affiché sur le bouton pour autre chose.

J'ai essayé de mettre la ligne de code suivante dans la méthode viewDidLoad du contrôleur de vue, mais cela ne semble pas fonctionner.

self.navigationItem.leftBarButtonItem.title = @"Log Out";

Que devrais-je faire?

Merci.

Vallée
la source

Réponses:

345

Cela doit être placé dans la méthode qui appelle le ViewController intitulé "NewTitle". Juste avant l'instruction push ou popViewController.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
Jordan
la source
47
Lorsque vous êtes dans le contrôleur de vue enfant, l'appel à partir du contrôleur de vue enfant ne fonctionnera pas. Vous devez l'appeler à partir du contrôleur de vue parent, tandis que dans le contrôleur de vue enfant.
Alex Reynolds
2
Pour modifier le bouton de retour de mon contrôleur de vue de troisième niveau (deuxième pression), j'ai dû utiliser la ligne suivante au lieu de la réponse ci-dessus: [[self.parentViewController navigationItem] setBackBarButtonItem: newBackButton]; Est-ce que je fais quelque chose de mal?
JonB
4
Jordan dit qu'il "[a ajouté] un peu plus de clarté sur l'endroit où mettre le code." Voici encore plus de clarté: placez-le dans le premier contrôleur (aka parent), immédiatement avant l'appel pour pousser le deuxième contrôleur (aka child).
benvolioT
1
vous pouvez créer un BaseViewController personnalisé et le mettre dans-viewDidLoad:
ArtFeel
2
Vous n'avez pas besoin de le faire juste avant de pousser ou de sauter. Vous pouvez le faire dans viewDidLoad ou loadView ou partout où vous définissez le titre et d'autres propriétés pour cette vue. La réponse de Victor Bogdan ci-dessous est plus claire, à mon humble avis.
Joe Strout
98

Dans ChildVC, cela a fonctionné pour moi ...

self.navigationController.navigationBar.topItem.title = @"Back";

Fonctionne aussi avec Swift!

self.navigationController!.navigationBar.topItem!.title = "Back"
Peter Pan
la source
4
Testé et vérifié sur iOS 7 dans Xcode 5.0.2. Cela changera le titre de l'écran précédent en arrière lorsque vous y retournerez.
Alex Zavatone
Solution la plus simple. Fonctionne sur iOS 6 et 7. Mettez dans la base UIViewController et c'est fait. Beaucoup mieux que la solution IB ou le réglage dans le vc poussant.
Eric Chen
46
cela change le titre du contrôleur de vue précédent, c'est le problème dans cette solution
Nikita
2
@Nikita, vous pouvez remettre la tuile en vueWillDisappear
Dan Beaulieu
81

Voici la documentation de backBarButtonItem :

"Lorsque cet élément de navigation est immédiatement en dessous de l'élément supérieur de la pile, le contrôleur de navigation dérive le bouton de retour de la barre de navigation de cet élément de navigation. [...] Si vous souhaitez spécifier une image ou un titre personnalisé pour le bouton de retour , vous pouvez plutôt affecter un élément de bouton de barre personnalisé (avec votre titre ou image personnalisé) à cette propriété. "

Contrôleur de vue A (le contrôleur de vue "parent" ):

self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

Lorsqu'un autre contrôleur de vue B se trouve au-dessus de la pile de navigation et que A se trouve juste en dessous, le bouton de retour de B aura le titre "Court" .

Victor Bogdan
la source
4
la partie délicate est que vous devez définir le bouton de retour dans le contrôleur de vue PARENT et non la vue enfant. Gaspillé une heure vient de comprendre cela.
Merkurial
56

dans Xcode 4.5 en utilisant le storyboard, la solution de loin la plus simple que j'ai trouvée lorsque la valeur du bouton Retour n'a pas à changer dynamiquement est d'utiliser le champ "Bouton Retour" associé à l'élément de navigation du contrôleur de vue auquel vous veulent que le bouton "Retour" dise autre chose.

Par exemple, dans la capture d'écran ci-dessous, je veux que le bouton Retour du ou des contrôleurs de vue que j'appuie ait "Retour" comme titre du bouton Retour.

entrez la description de l'image ici

bien sûr, cela ne fonctionnera pas si vous avez besoin du bouton retour pour dire quelque chose de légèrement différent à chaque fois ... il y a toutes les autres solutions ici pour cela.

john.k.doe
la source
La question d'origine ne disait rien sur l'utilisation des story-boards, donc c'est vraiment bien ce n'est pas la réponse acceptée, mais corrigez une solution c'est pour le développement basé sur les story-boards.
villapossu
42

Je sais, la question est très ancienne, mais j'ai trouvé une bonne solution.

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

Fonctionne avec childView! Testé avec iOS 7.

seniorbenelli
la source
Cela ne semble fonctionner qu'à un seul niveau. Cela ne fonctionne pas pour un enfant d'un enfant pour moi. iOS 8.
narco
26

Peut-être que je suis trop simpliste, mais dans la documentation d'Apple, le libellé est:

Si un élément de bouton de barre personnalisé n'est spécifié par aucun des contrôleurs de vue, un bouton de retour par défaut est utilisé et son titre est défini sur la valeur de la propriété title du contrôleur de vue précédent, c'est-à-dire le contrôleur de vue un niveau plus bas. la pile.

La solution marquée correcte ci-dessus définit un élément de bouton par défaut à partir du contrôleur parent. C'est la bonne réponse, mais je résous le problème en changeantself.title résous propriété de l'UIViewController juste avant de pousser le nouveau contrôleur sur la pile NavigationController.

Cela met automatiquement à jour le titre du bouton de retour sur le prochain contrôleur, et tant que vous self.titlerevenez à ce qu'il devrait être, viewWillAppearje ne vois pas cette méthode causer trop de problèmes.

Jessedc
la source
19

Cela fonctionne mieux pour moi. Essayez:

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
Felipe FMMobile
la source
19

Dans Swift / iOS8, les éléments suivants ont fonctionné pour moi:

let backButton = UIBarButtonItem(
      title: "Back Button Text",
      style: UIBarButtonItemStyle.Bordered,
      target: nil,
      action: nil
);

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

Tiré de la réponse de Felipe.

Duncan Smith
la source
la syntaxe de swift 1.1 estself.navigationController?.navigationBar.topItem?.backBarButtonItem
Warren Burton
3
Le style doit être UIBarButtonItemStyle.Plain
Micro
2
Merci pour cela. Quelle API vraiment pathétique. Et représentant d'UIKit en général. Entre les barres de navigation et les barres d'état dans iOS, c'est une merveille que nous développons encore pour cette putain de plateforme. Merci bébé jésus pour Stack Overflow et ses contributeurs!
Womble
@Wobmle: Vous devriez développer pour Android pendant quelques mois;)
fl034
17

Ok, voici le chemin. Si vous avez un contrôleur de vue "en premier" et que vous naviguez dans un autre contrôleur de vue "en second" en appuyant sur un bouton ou etc., vous devez effectuer un travail. Vous devez d'abord créer un BarButtonItem dans la méthode "Second" ViewDidLoad du contrôleur de vue comme ceci;

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

Après cela, vous devez écrire dans le code pour l'action "btnBack" dans le même fichier .m comme celui-ci;

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}

C'est tout.

EEE
la source
2
A leftBarButtonItemn'a pas l'apparence d'un backBarButtonItem, si cela est important dans la conception de l'application.
Alex Reynolds
1
Parmi les solutions publiées (merci beaucoup), celle-ci semble fonctionner, même si Alex l'a dit ci-dessus, le bouton de la barre de gauche ne ressemble pas à un élément de la barre arrière. Comment puis-je le faire ressembler à un élément de barre arrière ???
Dale
17

J'avais un contrôleur de vue parent avec un titre très long. Cela a entraîné le texte du bouton de retour dans le titre du contrôleur de vue enfant.

Après avoir essayé un tas de solutions différentes, voici ce que j'ai fini par faire (en développant l'approche @ john.k.doe):

Utilisation de Xcode 7.2, Swift 2

  1. Dans le Storyboard, ajoutez un Navigation Itemà la scène Parent View Controller (pas le VC enfant)

élément de navigation

  1. Sur le Attributes Inspectorde votre nouveau Navigation Item, tapez un spacecaractère dans le Back Buttonchamp. Plus d'informations à ce sujet plus tard.

élément de navigation dans la hiérarchie des vues

ajouter un caractère espace au champ Bouton Retour

  1. Dans le contrôleur de vue parent , ajoutez le code suivant:

fragment:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
    case is ChildViewController:
        navigationItem.backBarButtonItem?.title = ""
    default:
        navigationItem.backBarButtonItem?.title = "Full Parent Title"
    }
}

Explication:

Le type de bouton de retour appartient au contrôleur de vue parent. Le Navigation Itemvous donne une poignée sur le bouton de retour, vous pouvez donc définir le titre dans le code ou dans le Storyboard.

Remarque:

Si vous laissez le Navigation Item Back Buttontexte comme chaîne vide par défaut, le titre du bouton de retour deviendra "Retour".

D'autres approches fonctionnent, pourquoi utiliser celle-ci?:

Bien qu'il soit possible de remplacer le titre du bouton de retour sur le contrôleur de vue enfant, il était difficile d'obtenir une poignée jusqu'à ce qu'il ait déjà clignoté brièvement à l'écran.

Certaines approches construisent un nouveau bouton de retour et remplacent celui existant. Je suis sûr que cela fonctionne, et probablement nécessaire dans certains cas d'utilisation. Mais je préfère tirer parti des API existantes lorsque cela est possible.

La modification du titlecontrôleur de vue parent est la solution la plus rapide pour certaines situations. Cependant, cela change le titre parent, vous devez donc gérer l'état. Les choses deviennent également désordonnées Tab Bar Controllercar les changements de titre provoquent des effets secondaires avec les Tab Bar Itemtitres.

Robert Chen
la source
10

Pour ceux qui utilisent des storyboards, sélectionnez simplement le parent (pas celui qui contient la vue cible) le cadre du contrôleur de vue (assurez-vous de cliquer à droite sur la barre de navigation, puis ouvrez l'inspecteur d'attributs, où vous trouverez trois entrées de formulaire. La troisième " bouton de retour "est ce que nous recherchons.

pedrouan
la source
4
c'est la meilleure solution si vous ne vous souciez pas de la localisation.
MiQUEL
7

Version Swift:

Dans votre ViewController enfant:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}
buxik
la source
cela changera en fait le titre du contrôleur de vue précédent dans la pile en "TEXT", ce qui n'est pas idéal.
gravitron
6

Voici une autre façon de procéder.

Dans votre contrôleur de vue parent, implémentez la méthode suivante:

- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
  self.navigationItem.backBarButtonItem.title = newTitle;
}

Dans votre contrôleur de vue enfant, lorsque vous souhaitez modifier le titre, cela fonctionnera:

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

Je n'ai jamais pu faire fonctionner la parentViewControllerpropriété:

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];

Je ne sais pas si c'est un bug ou je ne l'utilise pas correctement. Mais la saisie de l'avant-dernier contrôleur de vue dans le viewControllerstableau pointe vers le contrôleur de vue parent, et je peux appeler correctement les méthodes parent avec cette référence.

Alex Reynolds
la source
6

D'accord. Personnellement, je détestais toutes ces options. Par conséquent, je suis venu avec le mien.

Sur la base des informations que j'ai vues. Il semble que le contrôleur de vue précédent contrôle son propre bouton "Retour" qui sera présenté sur le contrôleur de vue poussé.

J'ai créé une méthode de chargement différé pour le navigationItem sur le contrôleur qui veut le bouton de retour modifié.

Le mien est un contrôleur inviter l'acheteur

Inviter l'acheteur est le texte défini par défaut.

mais le bouton de retour devait être Inviter

Voici le code que j'ai utilisé pour créer le bouton de retour.

J'ai placé ce code en haut du fichier d'implémentation du contrôleur (.m) et il a remplacé automatiquement la méthode du super.

- (UINavigationItem *)navigationItem{
    UINavigationItem *item = [super navigationItem];
    if (item != nil && item.backBarButtonItem == nil)
    {
        item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
        item.backBarButtonItem.title = @"Invite";
    }

    return item;
}

Je pense que c'est une façon beaucoup plus élégante d'accomplir cela.

Je place ce code en un seul endroit, et il est automatiquement rempli en cas de besoin.

Pas besoin d'appeler le code avant chaque demande push.

J'espère que cela t'aides

The Lazy Coder
la source
5
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];
Gopikrishna
la source
5

Voici la réponse:

Dans viewDidAppear:animated(PAS dans viewDidLoad), procédez comme suit

- (void)viewDidAppear:(BOOL)animated
{
     [self.navigationController.navigationBar.backItem setTitle:@"anything"];

     // then call the super
     [super viewDidAppear:animated];
}

Que si vous souhaitez conserver la forme du bouton retour.

Basheer_CAD
la source
Pas mal sauf qu'ils peuvent le voir changer de titre. J'ai essayé dans viewWillAppear et cela ne fonctionne pas.
Travis M.
5

Aucune des solutions expliquées ici n'a fonctionné pour moi. J'ai donc supprimé le titre de la scène d'où je venais de la manière suivante:

self.title = @"";

Ainsi, lorsqu'une nouvelle scène est présentée, le texte arrière n'apparaît pas.

Je suis absolument d'accord que ce n'est pas une solution claire du tout, mais cela a fonctionné et aucune des explications n'a fonctionné pour moi.

Javier Calatrava Llavería
la source
Mec, je dois te dire, c'est 2017 et c'est toujours une douleur dans le a $$ pour gérer le bouton de retour. Votre méthode a fonctionné pour moi et je me suis retrouvé avec le signe "<" même si je voulais le mot "Annuler", mais je vais me contenter de ce que j'ai obtenu. :)
AnBisw
5

J'ai trouvé qu'il était préférable de changer le titre du contrôleur de vue actuel dans la pile de navigation pour le texte souhaité du bouton de retour avant de passer au contrôleur de vue suivant.

Par exemple

self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];

Ensuite, dans viewDidAppear, redéfinissez le titre sur le titre souhaité pour le VC d'origine. Voila!

OneInABajilian
la source
5

Pour Swift:

    // Rename back button
    let backButton = UIBarButtonItem(
        title: "Back",
        style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
        target: nil,
        action: nil
    )
    self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton
Ryan R
la source
4

J'ai trouvé que la façon la plus simple de changer le nom du bouton de retour est de définir le titre des contrôleurs de vue sur le titre du bouton de retour, puis de remplacer le titleView dans l'élément de navigation des contrôleurs de vue par une étiquette personnalisée avec c'est réel Nom.

Comme ça:

CustomViewController.m

@implementation CustomViewController

- (NSString*)title {
    return @"Back Button Title";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
    customTitleView.text = @"Navigation Bar Title";
    customTitleView.font = [UIFont boldSystemFontOfSize:20];
    customTitleView.backgroundColor = [UIColor clearColor];
    customTitleView.textColor = [UIColor whiteColor];
    customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    customTitleView.shadowOffset = CGSizeMake(0, -1);

    [customTitleView sizeToFit];

    self.navigationItem.titleView = [customTitleView autorelease];
}

@end

Cela rendra votre titre dans UINavigationBar comme s'il était natif. Donner au contrôleur de vue la possibilité d'avoir un titre séparé et un titre de bouton de retour.

Dans le cas des contrôleurs de vue A et B, A est responsable de dire à quoi devrait ressembler le bouton de retour, tandis que B est affiché.

EDIT: Cela conserve également l'aspect natif du bouton de retour (l'élément du bouton de la barre fléchée gauche).

Trenskow
la source
4

Ce code fonctionne aussi. Mettez ceci sur le contrôleur racine du contrôleur de navigation:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
user2666203
la source
4

Je suis nouveau dans iOS mais je fournirai ma réponse très simple de remplacer la classe du contrôleur de navigation. J'ai simplement remplacer les méthodes push et pop et enregistrer le titre du contrôleur de vue précédent. Désolé pour le collage dans le bloc js. Était peu confus comment le coller dans un bloc de code normal.

#import "MyCustomNavController.h"


@implementation MyCustomNavController {

    NSString *_savedTitle;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
    _savedTitle = self.topViewController.title;

    self.topViewController.title = title;
    [super pushViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {

    [self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
    return [super popViewControllerAnimated:animated];
}

@end

Sergey Brazhnik
la source
4

self.navigationController.navigationBar.backItem.title = @"TEXT";

Et dans Swift:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
GS
la source
3
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

vous pouvez le mettre où bon vous semble dans le code du contrôleur Parrent, ce qui vous permet d'avoir des boutons de commande différents pour différentes vues enfant.

chikuba
la source
3

La plupart des solutions tuent le style original de BackButton (le bouton de la barre fléchée gauche) tout en ajoutant un bouton habituel avec le titre souhaité.
Donc, pour conserver le style d'origine, il y a 2 façons:
1ère: utiliser un style de bouton non documenté (110 ou quelque chose comme ça) que je préfère ne pas faire. Mais si vous le souhaitez, vous pouvez trouver comment le faire ici, sur stackoverflow.
2e: Pour utiliser l'idée de Trenskow. Je l'ai aimé et je l'utilise un peu changé.
Au lieu de remplacer le titre - (NSString *), j'ai décidé de conserver le titre original de la manière suivante (ce qui me permet d'utiliser les titres de nib ainsi que le titre donné à l'état push btw).

- (void)viewDidLoad {
    [super viewDidLoad];
    static NSString * backButtonTitle=@"Back"; //or whatever u want

    if (![self.title isEqualToString:backButtonTitle]){

        UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
        customTitleView.text = self.title; // original title
        customTitleView.font = [UIFont boldSystemFontOfSize:20];
        customTitleView.backgroundColor = [UIColor clearColor];
        customTitleView.textColor = [UIColor whiteColor];
        customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
        customTitleView.shadowOffset = CGSizeMake(0, -1);

        [customTitleView sizeToFit];

        self.navigationItem.titleView = [customTitleView autorelease];
        self.title = backButtonTitle; 
    }
}

Cette solution fonctionne bien et semble native. De plus, si vous l'utilisez dans la méthode viewDidLoad, cela empêche l'exécution plus d'une fois.
J'ai aussi essayé une solution de Jessedc mais ça a l'air mauvais. Il provoque un changement visible de la barre de titre de l'utilisateur à la volée de l'original au BackButton souhaité et inversé.

Stan
la source
2

Cela fonctionne pour moi comme une version "simplifiée" des réponses postées précédentes.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

N'oubliez pas de mettre le code dans le contrôleur de vue parent (par exemple la vue qui a votre vue de table ou UITableViewController), pas la vue enfant ou détaillée (par exemple UIViewController).

Vous pouvez facilement localiser la chaîne du bouton de retour comme ceci:

backButton.title = NSLocalizedString(@"Back Title", nil);
Lex L.
la source
2

Nous avons deux VC A et B.

Si vous voulez changer le titre en B, écrivez ce code en A

- (IBAction)goToBViewController:(UIButton *)sender {

    BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:nil
                                                                 action:nil];
    [[self navigationItem] setBackBarButtonItem:newBackButton];
    [self.navigationController pushViewController:vc animated:NO];

}

Swift 4.1 Xcode 9.4

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)
iOS
la source
1

La réponse de Stan était la meilleure. Mais il y a aussi un problème, lorsque vous utilisez le contrôleur avec une barre d'onglets et que vous modifiez le titre du contrôleur, vous pouvez également changer le titre de la barre d'onglets. .title dans la fonction. La réponse est ici: (Avec ARC et ajoutez-les dans viewDidLoad de la vue)

  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }

Dans mon utilisation, j'en fais une fonction comme celle-ci, j'ai juste la fonctionnalité avec un code de ligne dans le viewDidLoad.

+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }
}
jtianling
la source
1

Si vous souhaitez non seulement modifier le texte du bouton Précédent en le même texte et conserver la forme de la flèche gauche d'origine, mais également faire quelque chose lorsque l'utilisateur clique sur le bouton Précédent, je vous recommande de jeter un œil à mon " CustomNavigationController " .

jianpx
la source
1

PROBLÈME: le texte "Retour" dans la barre de navigation ne peut pas être remplacé.

RAISON: le libellé "Retour" est défini dans la barre de navigation après avoir poussé une vue car l'attribut .title dans le contrôleur de vue parent était défini sur zéro (ou non initialisé).

UNE SOLUTION: Si vous définissez self.title = "Peu importe ...", vous verrez qu'au lieu de "Retour" apparaîtra "Peu importe ..." après avoir appuyé sur le nouveau contrôleur de vue.

Javier Calatrava Llavería
la source