Le "bouton retour" d'un UINavigationController
affiche par défaut le titre de la dernière vue de la pile. Existe-t-il un moyen d'avoir un texte personnalisé dans le bouton de retour à la place?
Le "bouton retour" d'un UINavigationController
affiche par défaut le titre de la dernière vue de la pile. Existe-t-il un moyen d'avoir un texte personnalisé dans le bouton de retour à la place?
Réponses:
Depuis ce lien :
self.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
Comme Tyler l'a dit dans les commentaires:
ne faites pas cela dans le contrôleur de vue visible, mais dans le contrôleur de vue que vous verriez si vous appuyez sur le bouton de retour
release
le UIBarButtonItem
.
UIBarButtonItemStyleBordered
par un appel à la propriété self.navigationItem.backBarButtonItem.style
. Documentation: developer.apple.com/library/ios/documentation/uikit/reference/…
Vous pouvez définir le texte dans Interface Builder:
Sélectionnez l'élément de navigation du ViewController auquel le bouton de retour reviendrait:
Dans l'inspecteur d'attributs du panneau des utilitaires, entrez votre libellé pour le bouton Retour:
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 un niveau plus haut dans la pile. En d'autres termes, ne faites pas cela dans le contrôleur de vue visible, mais dans le contrôleur de vue que vous verriez si vous appuyez sur le bouton de 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 à cela en définissant simplement le titre du contrôleur avant de pousser 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 viewWillAppear
, comme ceci:
-(void)viewWillAppear:(BOOL)animated
{
...
self.navigationItem.title = @"Original Title";
...
}
Cela fonctionne car le comportement par défaut UINavigationController
lors de la construction du bouton de retour lors d'une opération push est d'utiliser le titre du contrôleur précédent.
Le titre du bouton de retour est par défaut le titre de la vue précédente, donc une astuce rapide 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;
}
puis ajoutez une méthode simple, pour permettre le rejet de viewcontroller:
-(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
navigationController
et topItem
, par exemple:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Ajout à la réponse de rein. Notez dans la documentation d'Apple que la déclaration de backBarButtonItem est la suivante:
@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem
Par conséquent, la réponse de rein fuira de la mémoire car le setter synthétisé sera retain
l'instance que vous lui transmettez, qui n'est jamais libérée explicitement. Vous pouvez remédier à cela en utilisantautorelease
self.navigationItem.backBarButtonItem =
[[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStyleBordered
target:nil
action:nil] autorelease]; //<-- autoreleased
Ou vous pouvez pointer une variable sur l'instance afin de pouvoir la libérer explicitement plus tard:
UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];
J'espère que cela t'aides!
J'ai découvert quelque chose d'intéressant. Si vous sous-classez leUINavigationController
classez et remplacez la pushViewController:animated:
méthode et faites quelque chose comme ceci: (gardez à l'esprit 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 tout ce ViewControllers
qui est poussé avec votre contrôleur de navigation aura le bouton "Retour" en eux automatiquement. Si vous voulez changer le texte de certains contrôleurs de vue, vous pouvez essayer de convertir le contrôleur de vue dans une certaine classe ou votre propre protocole personnalisé (dont votre contrôleur de vue hérite et qui pourrait avoir une méthode comme backButtonText
ou quelque chose de stupide comme ça) qui peut vous donner certaines informations sur le viewcontroller qui arrive afin que vous puissiez personnaliser le texte du bouton de retour pour cela. Désormais, le texte du bouton de retour est pris en charge dans un endroit qui ne devrait en être que responsable. 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 laquelle ne pas le faire comme ça? Au moins, vous n'avez pas à jouer avec les titres du contrôleur de vue ou à vous rappeler de créer un nouveau bouton de retour avant d'appuyer sur le contrôleur de vue sur le 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 de retour modifié apparaîtra pour chacun d'eux, ce qui peut ne pas être ce que vous souhaitez.
Dans ce cas, vous devrez créer le UIBarButtonItem personnalisé chaque fois que vous poussez un contrôleur de vue.
Assurez-vous également de le faire avant d' appuyer sur le contrôleur de vue, sinon vous obtiendrez un hoquet d'écran lorsque le titre changera.
En développant la suggestion d'Aubrey, vous pouvez le faire dans le contrôleur de vue enfant:
créer deux variables pour stocker les anciennes valeurs de navigationItem.title du parent et navigationItem du parent
UINavigationItem* oldItem;
NSString* oldTitle;
dans viewDidLoad
, ajoutez ce qui suit:
oldItem = self.navigationController.navigationBar.topItem;
oldTitle = oldItem.title;
[oldItem setTitle: @"Back"];
dans viewWillDisappear
, ajoutez ce qui suit:
[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 au fur et à mesure que le nouveau contrôleur est animé. MAIS cela permet d'atteindre l'objectif d'étiqueter personnalisé le bouton de retour et de le garder en forme de bouton de retour standard.
Mettez cela en vous viewDidLoad
, espérons 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 souhaitez définir le titre dans le contrôleur ARRIVING (parfois plus de logique ..) dans swift 3, faites:
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 prochain contrôleur:
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 les réponses sont en quelque sorte mises à jour!
Le moyen le plus simple est de le faire dans le ViewController parent:
c'est-à-dire celui qui vous amène au contrôleur de vue suivant.
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)
Cette opération dans le code supprime le style de bouton de retour du UINavigationConroller
. Si vous ajoutez un élément de navigation dans chacune de vos vues, vous pouvez définir le titre du bouton arrière dans le StoryBoard
.
self.navigationController.navigationBar.topItem.title = @"Custom text";