web-dev-qa-db-fra.com

Comment changer le titre du bouton "Précédent" sur une barre de navigation

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, autrement dit 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é d'insérer 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.

218
Dale

Cela doit être placé dans la méthode qui appelle ViewController intitulée "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];
338
Jordan

Dans ChildVC cela a fonctionné pour moi ...

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

Fonctionne aussi à Swift!

self.navigationController!.navigationBar.topItem!.title = "Back"
92
Peter Pan

Voici la documentation pour backBarButtonItem :

"Lorsque cet élément de navigation est immédiatement sous l'élément supérieur dans la pile , Le contrôleur de navigation dérive le bouton Précédent de la barre de navigation À partir de cet élément de navigation. [...] Si vous souhaitez Spécifier une image personnalisée ou un titre pour le bouton Précédent, vous pouvez affecter un élément de bouton barre personnalisée (avec votre titre ou votre image personnalisés) à cette propriété à la place. "

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

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 en haut de la pile de navigation et que A se trouve juste en dessous, le bouton retour de B porte le titre "Court".

80
Victor Bogdan

dans Xcode 4.5, en utilisant le storyboard, la solution la plus simple que j'ai trouvée lorsque la valeur du bouton Précédent n'a pas besoin de changer de façon dynamique consiste à utiliser le champ "Bouton Précédent" associé à l'élément de navigation du contrôleur de vue auquel vous vous connectez. veux que le bouton "Retour" dise autre chose.

par exemple. Dans la capture d'écran ci-dessous, je souhaite que le bouton Précédent du ou des contrôleurs de vue que je souhaite appuyer ait le titre "Retour".

enter image description here

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

56
john.k.doe

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

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

Fonctionne de childView! Testé avec iOS 7.

41
seniorbenelli

Peut-être suis-je trop simpliste, mais voici ce que dit la documentation d'Apple: 

Si aucun élément du bouton personnalisé barre n'est spécifié par l'un des contrôleurs de vue, un bouton 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 sur 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 modifiant la propriété self.title de UIViewController juste avant de placer le nouveau contrôleur sur la pile NavigationController.

Ceci met automatiquement à jour le titre du bouton Précédent sur le prochain contrôleur et tant que vous redéfinissez self.title sur ce qu'il devrait être dans viewWillAppear, je ne peux pas voir cette méthode causer trop de problèmes.

25
Jessedc

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;

Porté de la réponse de Felipe.

18
Duncan Smith

Cela fonctionne mieux pour moi. Essayez: 

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

Ok, voici le chemin. Si vous avez un contrôleur de vue "premier" et que vous naviguez dans un autre contrôleur de vue "seconde" en appuyant sur un bouton, etc., vous devez effectuer quelques tâches. Vous devez d’abord créer un BarButtonItem dans la méthode ViewDidLoad du "second" 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];

Cela fait, vous devez écrire dans le même fichier .m dans le code correspondant à l'action "btnBack".

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

C'est tout.

17
EEE

J'ai eu un contrôleur de vue parent avec un très long titre. Cela a eu pour résultat que le texte du bouton Précédent s'est insinué dans le titre du contrôleur de vue enfant.

Après avoir essayé différentes solutions, voici ce que j’ai finalement fait (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 View Controller Parent (pas le VC enfant).

 navigation item

  1. Sur le Attributes Inspector de votre nouveau Navigation Item, saisissez un caractère space dans le champ Back Button. Plus sur cela plus tard.

 navigation item in View Hierarchy

 add a space character to the Back Button field

  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 bouton de retour appartient en quelque sorte au contrôleur de vue parent. Le Navigation Item vous donne une poignée pour le bouton de retour, vous pouvez donc définir le titre en code ou dans le Storyboard.

Remarque:

Si vous laissez le texte Navigation ItemBack Button comme chaîne vide par défaut, le titre du bouton Précédent deviendra "Précédent".

Les 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 de le manipuler jusqu'à ce qu'il apparaisse brièvement à l'écran.

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

Changer la title du contrôleur de vue parent est la solution la plus rapide dans certaines situations. Cependant, cela change le titre parent et vous devez donc gérer l’état. Les choses deviennent également compliquées avec un Tab Bar Controller parce que les changements de titre entraînent des effets secondaires avec les titres Tab Bar Item.

15
Robert Chen

Pour ceux qui utilisent des storyboards, sélectionnez simplement le cadre du contrôleur de vue parent (et non celui qui contient la vue cible) (assurez-vous de bien cliquer 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.

9
pedrouan

Version rapide:

Dans votre ViewController enfant:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}
7
buxik

Voici une autre façon de le faire.

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 réussi à obtenir la propriété parentViewController au travail:

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

Je ne sais pas si c'est un bug ou si je ne l'utilise pas correctement. Toutefois, le fait de saisir l'avant-dernier contrôleur de vue dans le tableau viewControllers pointe sur le contrôleur de vue parent et je peux appeler les méthodes parent correctement avec cette référence.

6
Alex Reynolds

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 "Précédent" qui sera présenté sur le contrôleur de vue avancée.

J'ai créé une méthode de chargement différé pour le composant navigationItem du contrôleur qui souhaite modifier le bouton Précédent.

Le mien est un contrôleur d'invitation à l'achat

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 Implementatio (.m) du contrôleur et il a automatiquement remplacé 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'y parvenir.

Je place ce code dans un endroit et il est automatiquement renseigné si nécessaire.

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

J'espère que cela t'aides

5
The Lazy Coder

Aucune des solutions expliquées ici ne fonctionnait pour moi. Alors ce que j'ai fait, c'est enlever le titre de la scène d'où je viens, 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 tout à fait d’accord pour dire que ce n’est pas une solution claire du tout, mais que cela a fonctionné et que rien de ce qui a été expliqué ne fonctionne pour moi.

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 voulez conserver la forme du bouton de retour.

5
Basheer_CAD

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
5
Ryan R
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];
5
Gopikrishna

J'ai trouvé que le moyen le plus simple de changer le nom du bouton Précédent consiste à définir le titre du contrôleur de vue sur le titre du bouton Précédent, puis à remplacer le titre dans l'élément de navigation des contrôleurs de vue par un libellé personnalisé. pré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 donnera à votre titre dans UINavigationBar une apparence native. 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 son bouton de retour devrait ressembler, alors que B est affiché.

EDIT: Ceci conserve également l’aspect natif du bouton Précédent (l’élément du bouton de la barre fléché à gauche).

4
Trenskow

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

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

Je suis nouveau dans iOS, mais je vais donner ma réponse très simple qui consiste à remplacer la classe du contrôleur de navigation . Désolé pour le collage dans le bloc js. Était peu confus comment le coller dans le 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

4
Sergey Brazhnik

J'ai constaté qu'il est préférable de modifier le titre du contrôleur de vue actuel dans la pile de navigation en remplaçant le texte souhaité par le bouton Précédent avant de passer au contrôleur de vue suivant.

Par exemple

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

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

4
OneInABajilian

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

Et à Swift:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
4
onmir

La plupart des solutions suppriment le style original de BackButton (bouton de la barre avec une flèche vers la gauche) tout en ajoutant un bouton habituel avec le titre souhaité.
Donc, pour conserver le style original, il y a 2 façons:
1er: Utiliser un style de bouton non documenté (110 ou quelque chose du genre) que je préfère ne pas faire. Mais si vous voulez, vous pouvez trouver comment le faire ici, sur stackoverflow.
2nd: Pour utiliser l’idée de Trenskow. Je l'ai aimé et je l'utilise un peu changé.
Au lieu de remplacer - (NSString *) titre, 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é à Push State).

- (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é la solution de Jessedc mais ça a l'air mal. Cela provoque un changement visible de la barre de titre de l'utilisateur à la volée, de l'original au retour souhaité de BackButton.

3
Stan
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

vous pouvez le placer où bon vous semble dans le code du contrôleur de parrent, ce qui vous permet d’avoir des backbuttons différents pour différentes vues enfants. 

3
chikuba

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

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

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

N'oubliez pas de placer le code dans le contrôleur de vue parent (par exemple, la vue contenant 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);
2
Lex L.

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 modifiez le titre du contrôleur, vous pouvez également modifier 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, je fais une fonction comme ceci, juste avoir 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;
  }
}
1
jtianling

Si vous souhaitez non seulement modifier le texte du bouton Précédent pour qu'il reste identique à celui de la flèche gauche, mais également que vous fassiez quelque chose lorsque l'utilisateur clique sur le bouton Précédent, je vous recommande de regarder autour de mon " CustomNavigationController ".

1
jianpx

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

RAISON: L'étiquette "Back" est définie 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 nil (ou non initialisé).

UNE SOLUTION: Si vous définissez self.title = "Whatever ...", vous verrez qu'au lieu de "Back", le message "Whatever ..." apparaîtra après que vous ayez poussé le nouveau contrôleur de vue.

Swift 4
iOS 11.2
Xcode 9.2 

TableViewController1  ---segue--->   TableViewController2

Vous pouvez modifier le texte du bouton Précédent dans TableViewController1 ou TableViewController2. 

Modifie le texte du bouton de retour dans TableViewController1 :

1) En viewWillAppear()

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let myBackButton = UIBarButtonItem()
    myBackButton.title = "Custom text"
    navigationItem.backBarButtonItem = myBackButton
}

Pour une raison quelconque, viewDidLoad () est trop tôt pour ajouter le bouton Précédent à NavigationItem. Pour connecter les deux TableViewControllers, dans le contrôle du storyboard, faites glisser de TableViewCell dans TableViewController1 jusqu'au milieu de TableViewController2, puis sélectionnez Selection Segue > Show dans le menu contextuel. 

2) En tableView(_:didSelectRowAt:):

override func tableView(_ tableView: UITableView, didSelectRowAt: IndexPath) {

    let myButton = UIBarButtonItem()
    myButton.title = "Custom text"
    navigationItem.backBarButtonItem = myButton

    performSegue(withIdentifier: "ShowMyCustomBackButton", sender: nil)
}

Pour connecter les deux TableViewControllers, dans le contrôle du storyboard, faites glisser le petit cercle jaune au-dessus de TableViewController1 jusqu'au milieu de TableViewController2, puis sélectionnez Manual Segue > Show dans le menu contextuel. Sélectionnez ensuite la séquence reliant les deux TableViewControllers, puis dans l'inspecteur d'attributs en regard de "Identifier", entrez "ShowMyCustomBackButton".

3) Dans la storyboard

Si vous avez juste besoin d'un texte personnalisé statique pour le bouton Précédent, sélectionnez le NavigationItem pour TableViewController1 (il possède un < pour une icône dans la table des matières du storyboard), puis ouvrez l'inspecteur d'attributs et saisissez votre texte personnalisé dans le champ "Bouton Précédent". (assurez-vous de sortir de ce champ pour que le changement prenne effet).


Modifie le texte du bouton de retour dans TableViewController2 :

1) En viewWillAppear():

class MySecondTableViewController: UITableViewController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let myBackButton = UIBarButtonItem(
            title: "<Custom text",
            style: .plain,
            target: self,
            action: #selector(goBack)  //selector() needs to be paired with an @objc label on the method
        )

        navigationItem.leftBarButtonItem = myBackButton
    }

    @objc func goBack() {
        navigationController?.popViewController(animated: true)
    }

Pour connecter les deux TableViewControllers, dans le contrôle du storyboard, faites glisser de TableViewCell dans TableViewController1 jusqu'au milieu de TableViewController2, puis sélectionnez Selection Segue > Show dans le menu contextuel. 

1
7stud

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)
1
iOS

Utilisez la ligne de code ci-dessous:

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

self.navigationItem.leftBarButtonItems =[[NSArray alloc] initWithObjects:newBackButton, nil];

self.navigationItem.leftItemsSupplementBackButton = YES;
1
Payal Maniyar

Selon document of UINavigationBar> backItem

 enter image description here

Si la propriété leftBarButtonItem de l'élément de navigation le plus haut est nil, la barre de navigation affiche un bouton Précédent dont le titre est dérivé de l'article dans cette propriété.

Cependant, la définition de backItem.backBarButtonItem ne fonctionne pas lors de la première utilisation de viewWillAppear. La définition de topItem.backBarButtonItem ne fonctionne que lors de la première utilisation de viewWillAppear. Parce que navigationBar.topItem pointe toujours sur le previousViewController.navigationItem. Dans viewWillLayoutSubviews, les topItem et backItem sont mises à jour. Donc, après la première fois viewWillAppear, nous devrions définir le backItem.backBarButtonItem

REPONSE: Définition d'une backBarButtonItem sur la navigationItem du viewController précédent, peu importe quand et où dans votre viewController actuel (le viewController supérieur). Vous pouvez utiliser ce code dans viewWillAppear ou viewDidLoad. Consulter mon article de blog iOS Définir le titre du bouton Précédent de la barre de navigation pour une analyse détaillée.

 NSArray *viewControllerArray = [self.navigationController viewControllers];
    // get index of the previous ViewContoller
    long previousIndex = [viewControllerArray indexOfObject:self] - 1;
    if (previousIndex >= 0) {
        UIViewController *previous = [viewControllerArray objectAtIndex:previousIndex];
        previous.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
                                                         initWithTitle:backButtonTitle
                                                         style:UIBarButtonItemStylePlain
                                                         target:self
                                                         action:nil];
    }
1
situee

Si vous avez plus d’une navigation qui est

ParentViewController -> ChildViewController1 -> ChildViewController2

vous pouvez utiliser le code ci-dessous pour changer le titre du bouton de retour dans la barre de navigation.

self.navigationController? .navigationBar.topItem? .backBarButtonItem = UIBarButtonItem.init (titre: "Retour", style: .plain, cible: nil, action: nil)

0
Rizwan Shaikh

Cela fonctionne pour moi dans Swift 4 et iOS 11. Le plus souvent, je dois le faire lorsque l'utilisateur appuie sur une ligne dans une vue de table et qu'un nouveau contrôleur de vue est placé dans la pile de navigation. Habituellement, je veux que le bouton Précédent soit le nom ou un attribut de l'objet représenté par la ligne sélectionnée. Donc, je fais habituellement ceci dans didSelectRowAt... comme ceci: 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let object = // get the object this row represents

    let backButton = UIBarButtonItem()
    backButton.title = object.name // or whatever
    self.navigationItem.backBarButtonItem = backButton

    // now show or segue to the next view controller
}
0
Murray Sagal

Il semble que le contrôleur de navigation recherche

previousViewController.navigationItem.title

Si rien là-bas il cherche

previousViewController.title
0
Basem Saadawy