Il "pulsante Indietro" di a UINavigationController
per impostazione predefinita mostra il titolo dell'ultima vista nello stack. Esiste un modo per avere testo personalizzato nel pulsante Indietro?
Il "pulsante Indietro" di a UINavigationController
per impostazione predefinita mostra il titolo dell'ultima vista nello stack. Esiste un modo per avere testo personalizzato nel pulsante Indietro?
Risposte:
Da questo link :
self.navigationItem.backBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStylePlain
target:nil
action:nil];
Come ha detto Tyler nei commenti:
non farlo nel controller della vista visibile, ma nel controller della vista che vedresti se premi il pulsante Indietro
release
il UIBarButtonItem
.
UIBarButtonItemStyleBordered
con una chiamata alla proprietà self.navigationItem.backBarButtonItem.style
. Documentazione: developer.apple.com/library/ios/documentation/uikit/reference/…
È possibile impostare il testo in Interface Builder:
Seleziona l'elemento di navigazione del ViewController in cui il pulsante Indietro tornerà a:
Nella finestra di ispezione degli attributi del pannello delle utility, inserisci la tua etichetta per il pulsante Indietro:
Preferirei questo approccio piuttosto che impostare il titolo nel codice come nella risposta accettata.
Inoltre, è necessario eseguire questa operazione nel controller di visualizzazione a un livello superiore dello stack. In altre parole, non farlo nel controller della vista visibile, ma nel controller della vista che vedresti se premi il pulsante Indietro.
--Tyler
Io lo uso questo:
// 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";
}
Ho trovato una soluzione utile a ciò semplicemente impostando il titolo del controller prima di spingere un altro controller nello stack, in questo modo:
self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];
Quindi, assicurati di impostare il titolo originale in viewWillAppear
questo modo:
-(void)viewWillAppear:(BOOL)animated
{
...
self.navigationItem.title = @"Original Title";
...
}
Questo funziona perché il comportamento predefinito di UINavigationController
quando si costruisce il pulsante Indietro durante un'operazione push è di usare il titolo del controller precedente.
Il titolo del pulsante Indietro viene impostato automaticamente sul titolo della vista precedente, quindi un trucco rapido che uso è quello di posizionare il seguente codice sul file .m della vista precedente.
-(void)viewWillAppear:(BOOL)animated {
// Set title
self.navigationItem.title=@"Original Title";
}
-(void)viewWillDisappear:(BOOL)animated {
// Set title
self.navigationItem.title=@"Back";
}
nel tuo metodo init, aggiungi il seguente codice:
- (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;
}
quindi aggiungi un metodo semplice per consentire la chiusura di viewcontroller:
-(void)goBack {
[self.navigationController popViewControllerAnimated:YES];
}
Aggiungi il seguente codice in viewDidLoad o loadView
self.navigationController.navigationBar.topItem.title = @"Custom text";
L'ho provato su iPhone e iPad con iOS 9
navigationController
e topItem
, ad esempio:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Aggiungendo alla risposta di Rein. Nota dai documenti di Apple che la dichiarazione di backBarButtonItem è questa:
@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem
Pertanto, la risposta di Rein perderà la memoria perché il setter sintetizzato sarà retain
l'istanza in cui la passi, che non viene mai rilasciata esplicitamente. Puoi rimediare usandoautorelease
self.navigationItem.backBarButtonItem =
[[[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
style:UIBarButtonItemStyleBordered
target:nil
action:nil] autorelease]; //<-- autoreleased
Oppure puoi puntare una variabile all'istanza in modo da poterla rilasciare esplicitamente in un secondo momento:
UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];
Spero che questo ti aiuti!
Ho scoperto qualcosa di interessante. Se esegui la sottoclasse del UINavigationController
e sostituisci il pushViewController:animated:
metodo e fai qualcosa del genere: (tieni presente che sto usando ARC)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
initWithTitle: @"Back"
style: UIBarButtonItemStyleBordered
target: nil action: nil];
viewController.navigationItem.backBarButtonItem = backButton;
[super pushViewController:viewController animated:animated];
Quindi, per tutto ViewControllers
ciò che viene premuto con il controller di navigazione, il pulsante "Indietro" sarà automaticamente inserito. Se si desidera modificare il testo per determinati controller di visualizzazione, è possibile provare e magari trasmettere il viewcontroller a una determinata classe o al proprio protocollo personalizzato (che eredita il viewcontroller dal quale potrebbe avere un metodo simile backButtonText
o qualcosa di stupido come quello) che può darvi alcune informazioni sul viewcontroller che arrivano in modo da poter personalizzare il testo del pulsante Indietro. Ora il testo del pulsante Indietro è curato in un luogo che dovrebbe essere ritenuto l'unico responsabile. Devo ammettere che la creazione di un nuovo pulsante per modificare il testo fa schifo, ma vabbè.
Qualcuno può pensare a una ragione per non farlo in questo modo? Almeno non è necessario giocherellare con i titoli del controller di visualizzazione o ricordare di creare un nuovo pulsante Indietro prima di premere il viewcontroller sul controller di navigazione.
la risposta di Rein funziona bene.
Si noti che se si preme più di un controller di visualizzazione, il titolo del pulsante Indietro modificato verrà visualizzato per ciascuno di essi, che potrebbe non essere quello desiderato.
In tal caso, dovrai creare UIBarButtonItem personalizzato ogni volta che premi un controller di visualizzazione.
Inoltre, assicurati di farlo prima di premere il controller di visualizzazione, altrimenti otterrai un singhiozzo dello schermo quando il titolo cambia.
Espandendo il suggerimento di Aubrey, è possibile farlo nel controller della vista figlio:
creare due variabili per memorizzare i vecchi valori di navigationItem.title del genitore e di navigationItem del genitore
UINavigationItem* oldItem;
NSString* oldTitle;
in viewDidLoad
, aggiungere quanto segue:
oldItem = self.navigationController.navigationBar.topItem;
oldTitle = oldItem.title;
[oldItem setTitle: @"Back"];
in viewWillDisappear
, aggiungere quanto segue:
[oldItem setTitle: oldTitle];
oldTitle = nil; // do this if you have retained oldTitle
oldItem = nil; // do this if you have retained oldItem
Non è perfetto Vedrai cambiare il titolo della vista genitore mentre il nuovo controller è animato. MA questo raggiunge l'obiettivo di etichettare in modo personalizzato il pulsante Indietro e mantenerlo a forma di pulsante Indietro standard.
Metti questo in te viewDidLoad
, spero che si traduca in quello che stai cercando
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close"
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];
se vuoi impostare il titolo nel controller ARRIVO (a volte più logica ...) in Swift 3 fai:
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
}
})
}
nel controller imminente:
override func viewDidLoad() {
super.viewDidLoad()
self.setBackButtonNavBar(title: "back", delay: 0.3)
}
di solito inserisco self.setBackButtonNavBar in un'estensione del controller.
So che questa è una vecchia domanda e il tipo di risposte è stato aggiornato!
Il modo più semplice è farlo nel ViewController principale:
cioè quello che ti porta al controller della vista successiva.
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)
In questo modo nel codice rimuovere lo stile del pulsante Indietro di UINavigationConroller
. Se aggiungi un elemento di navigazione in ciascuna delle tue viste, puoi impostare il titolo del retro in StoryBoard
.
self.navigationController.navigationBar.topItem.title = @"Custom text";