UINavigationController “back button” texte personnalisé?
-
10-07-2019 - |
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?
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:
Dans l'inspecteur d'attributs du panneau des utilitaires, entrez votre étiquette pour le bouton Précédent:
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
.