Question

Le "bouton de retour" " d’un UINavigationController indique par défaut le titre de la dernière vue de la pile. Existe-t-il un moyen d’avoir du texte personnalisé dans le bouton Précédent?

Était-ce utile?

La solution

De ce lien :

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

Comme l'a dit Tyler dans les commentaires:

  

ne faites pas cela dans le contrôleur de vue visible, mais dans la vue   contrôleur que vous verriez si vous appuyez sur le bouton retour

Autres conseils

Vous pouvez définir le texte dans Interface Builder:

Sélectionnez l'élément de navigation du ViewController vers lequel le bouton Précédent retournerait:

entrer la description de l'image ici

Dans l'inspecteur d'attributs du panneau des utilitaires, entrez votre étiquette pour le bouton Précédent:

entrer la description de l'image ici

Je préférerais cette approche à la définition du titre dans le code, comme dans la réponse acceptée.

  

Notez également que vous devez le faire dans le contrôleur de vue au niveau supérieur.   empiler. En d'autres termes, ne faites pas cela dans le contrôleur de vue visible,   mais dans le contrôleur de vue, vous verriez si vous appuyez sur le bouton Retour.
   - Tyler

J'utilise ceci:

// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.backItem.title = @"Custom text";
}

J'ai trouvé une solution pratique à ce problème en définissant simplement le titre du contrôleur avant de placer un autre contrôleur sur la pile, comme ceci:

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

Ensuite, assurez-vous de définir le titre d'origine dans viewWillAppear , comme suit:

-(void)viewWillAppear:(BOOL)animated
{
  ...
  self.navigationItem.title = @"Original Title";
  ...
}

Cela fonctionne car le comportement par défaut de UINavigationController lors de la construction du bouton Précédent lors d'une opération push consiste à utiliser le titre du contrôleur précédent.

Le titre du bouton Précédent est remplacé par défaut par le titre de la vue précédente. Un astuce que j'utilise consiste à placer le code suivant sur le fichier .m de la vue précédente.

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

dans votre méthode init, ajoutez le code suivant:

- (id)initWithStyle:(UITableViewStyle)style {
    if(self = [super init]) {

        //...

        UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                             style:UIBarButtonItemStylePlain 
                                            target:self 
                                            action:@selector(goBack)];
        self.navigationItem.leftBarButtonItem = customBackButton;
        [customBackButton release];

        //...
    }
    return self;
}

ajoutez ensuite une méthode simple pour autoriser le contrôleur de vue à ignorer:

-(void)goBack {
    [self.navigationController popViewControllerAnimated:YES];  
}

Ajoutez le code suivant dans viewDidLoad ou loadView

self.navigationController.navigationBar.topItem.title = @"Custom text";

Je l'ai testé sur iPhone et iPad avec iOS 9

Ajout pour réduire la réponse. Notez dans les documents d'Apple que la déclaration de backBarButtonItem est la suivante:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

Par conséquent, la réponse de rein perdra de la mémoire car le setter synthétisé conservera l'instance que vous lui transmettez, laquelle n'est jamais explicitement publiée. Vous pouvez y remédier en utilisant autorelease

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

Vous pouvez également indiquer une variable à l'instance pour pouvoir la publier explicitement ultérieurement:

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

J'espère que ça aide!

- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}

J'ai découvert quelque chose d'intéressant. Si vous sous-classez le UINavigationController et remplacez la méthode pushViewController: animated: et procédez comme suit: (n'oubliez pas que j'utilise ARC)

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

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

Ensuite, pour tous les ViewControllers poussés avec votre contrôleur de navigation, l’option " Back " bouton en eux automatiquement. Si vous souhaitez modifier le texte de certains contrôleurs de vue, vous pouvez essayer de convertir le contrôleur de vue en classe ou en votre propre protocole personnalisé (dont votre contrôleur de contrôle hérite, ce qui pourrait donner lieu à une méthode telle que backButtonText . idiot comme ça) qui peut vous donner certaines informations sur le contrôleur de vue qui arrive afin que vous puissiez personnaliser le texte du bouton de retour pour cela. Maintenant, le texte du bouton de retour est pris en charge dans un endroit qui devrait contenir la responsabilité uniquement. Je dois admettre que créer un nouveau bouton pour changer le texte est nul, mais bon.

Quelqu'un peut-il penser à une raison pour ne pas le faire comme ça? Au moins, vous n’aurez pas à manipuler les titres de viewcontroller ni à vous rappeler de créer un nouveau bouton Précédent avant d’appuyer sur le viewcontroller du contrôleur de navigation.

La réponse de Rein fonctionne bien.

Notez que si vous appuyez sur plusieurs contrôleurs de vue, le titre du bouton Précédent modifié apparaît pour chacun d'eux, ce qui peut ne pas être ce que vous souhaitez.

Dans ce cas, vous devez créer le UIBarButtonItem personnalisé chaque fois que vous poussez un contrôleur de vue.

Assurez-vous également de le faire avant avant d'appuyer sur le contrôleur de vue, sinon vous obtiendrez un hoquet à l'écran lorsque le titre changera.

En suivant la suggestion d’Aubrey, vous pouvez le faire dans le contrôleur de vue enfant:

créer deux variables pour stocker les anciennes valeurs du fichier navigationItem.title et du fichier navigationItem du parent

UINavigationItem* oldItem;
NSString* oldTitle;

dans viewDidLoad , ajoutez les éléments suivants:

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

dans viewWillDisappear , ajoutez les éléments suivants:

[oldItem setTitle: oldTitle];  
oldTitle = nil;  // do this if you have retained oldTitle
oldItem = nil;   // do this if you have retained oldItem

Ce n'est pas parfait. Vous verrez le titre de la vue parent changer lorsque le nouveau contrôleur est animé. MAIS ceci permet d’atteindre l’objectif consistant à marquer de manière personnalisée le bouton Précédent et à le conserver en forme de bouton Précédent.

Mettez ceci en vous viewDidLoad , en espérant que cela aboutira à ce que vous recherchez

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" 
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];

si vous voulez définir le titre dans le contrôleur ARRIVING (parfois plus de logique ..) dans swift 3 do:

func setBackButtonNavBar(title: String, delay: Double){

    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in

        if let navBar = self.navigationController?.navigationBar{
            navBar.backItem?.title = title
        }
    })

}

dans le contrôleur à venir:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setBackButtonNavBar(title: "back", delay: 0.3)
}

généralement, je mets self.setBackButtonNavBar dans une extension de contrôleur.

Je sais que c'est une vieille question et que les réponses sont en quelque sorte mises à jour!

Le moyen le plus simple est de faire cela dans ViewController parent:

c'est-à-dire celui qui vous conduit au prochain contrôleur de vue.

self.navigationItem.backBarButtonItem  = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)

Ceci dans le code supprime le style du bouton Précédent du UINavigationConroller . Si vous ajoutez un élément de navigation dans chacune de vos vues, vous pouvez définir le titre du bouton précédent dans le StoryBoard .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top