UINavigationController "pulsante indietro" testo personalizzato?


147

Il "pulsante Indietro" di a UINavigationControllerper impostazione predefinita mostra il titolo dell'ultima vista nello stack. Esiste un modo per avere testo personalizzato nel pulsante Indietro?


1
Questo lavoro per meself.navigationController.navigationBar.topItem.title = @"Custom text";
huync,

Risposte:


342

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


4
Si dovrebbe releaseil UIBarButtonItem.
Mehrdad Afshari,

217
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,

6
Solo per chiarire il commento di Tyler perché all'inizio non l'ho capito: Impostazione di backBarButtonItem in una vista controller navigationItem sta impostando il pulsante che mostrerà per tornare a questo controller vista. Si noti inoltre che sebbene non sia presente uno stile pulsante per il pulsante freccia, questo pulsante otterrà comunque lo stile freccia. Ho usato UIBarButtonItemStylePlain e ottengo ancora lo stile del pulsante freccia.
Jon Steinmetz,

3
Suggerimento: anziché assumere lo stile, passa lo stile attualmente impostato. Nel codice di questa risposta, sostituirlo UIBarButtonItemStyleBorderedcon una chiamata alla proprietà self.navigationItem.backBarButtonItem.style. Documentazione: developer.apple.com/library/ios/documentation/uikit/reference/…
Basil Bourque,

1
Si noti che in ARC è necessario escludere la chiamata di rilascio automatico. quindi hai self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle: @ stile "Titolo personalizzato": UIBarButtonItemStyleBordered target: nil action: nil];
bkbeachlabs,

43

È possibile impostare il testo in Interface Builder:

Seleziona l'elemento di navigazione del ViewController in cui il pulsante Indietro tornerà a:

inserisci qui la descrizione dell'immagine

Nella finestra di ispezione degli attributi del pannello delle utility, inserisci la tua etichetta per il pulsante Indietro:

inserisci qui la descrizione dell'immagine

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


Questa è la migliore risposta che ho trovato finora.
Ayan Sengupta

2
Per essere chiari, questo deve essere impostato sull'elemento di navigazione del controller di visualizzazione, non sulla stessa finestra di ispezione degli attributi del controller di visualizzazione.
Patrick Leggi il

Questa è la migliore risposta che ho trovato.
bicepjai,

Questa è la risposta migliore
Alex Brown,

2
A partire da Xcode 6.1.1 e in esecuzione su iOS 7, sembra che il titolo della visualizzazione precedente originale ANCORA prevalga su qualsiasi titolo del pulsante Indietro impostato qui. Se il titolo della vista precedente contiene più del limite di 11 caratteri, il pulsante Indietro della vista successiva dirà semplicemente "Indietro". Non c'è modo di evitarlo se non quello di creare da zero un nuovo elemento della barra di navigazione, come mostrato nella risposta più votata qui.
ray,

22

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";
}

Questo funziona quasi per me, ma quando faccio clic sul pulsante Indietro, il testo torna al titolo del genitore per la durata dell'animazione :-(
Danny Tuppeny,

3
Ciò modifica il titolo del pulsante Indietro del controller in alto nello stack. Non cambia il titolo del pulsante Indietro del controller attualmente visualizzato. Ancora peggio: cambia il titolo del controller precedente al controller precedente!
leviatano,

Come notato da altri commentatori, questo metodo è un po 'insostenibile. Non consiglierei di farlo in quanto non è proprio il modo in cui l'API ti intende utilizzare. Potresti essere pronto per bug difficili in futuro!
RickDT,

11

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 viewWillAppearquesto modo:

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

Questo funziona perché il comportamento predefinito di UINavigationControllerquando si costruisce il pulsante Indietro durante un'operazione push è di usare il titolo del controller precedente.


1
Il problema con questo è che il titolo cambia nella vecchia vista mentre si anima e sembra un po 'naff. Nessuna delle soluzioni fornite qui sembra funzionare come desideri :-(
Danny Tuppeny,

1
Questo è perfetto nella mia situazione perché non visualizzo NavBar nella schermata precedente e voglio solo rimuovere il titoloLabel dal pulsante indietro sul nuovo schermo e ho solo la freccia chevron di iOS7. Posso quindi solo impostare un valore letterale NSString vuoto per il titolo.
siburb

premendo il controller della vista si solleva l'eccezione quando si tocca indietro
Sumit

7

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";
}

Funziona abbastanza bene in molti casi ed è piuttosto semplice ... l'unica osservazione è che l'override di uno di questi metodi richiede che l'implementazione del super sia chiamata ad un certo punto nel nuovo metodo.
izk,

2
Con questo metodo, si noterà che il titolo della vista padre viene modificato in 'Indietro' prima che si verifichi l'animazione push. (E, in un certo senso fa schifo, che se lo sposti sul metodo viewDidDisappear, vedrai il passaggio dopo la pressione ..)
James Boutcher,

Adoro questo metodo, ma il problema che devo affrontare è che il "Titolo originale" viene impostato correttamente, ma viene fornito con dei puntini di sospensione se è più lungo di "Indietro" che deve essere dovuto al fatto che la vista non è ancora nella gerarchia della vista , non inoltra la vista del titolo. Il problema descritto da @JamesBoutcher sopra è per me impercettibile a causa della rapida velocità iniziale dell'animazione. In effetti, mi sono appena reso conto che il problema che ho di fronte è particolarmente evidente a causa dell'animazione a fine lento che è quando questo problema è evidente.
trss,

Mentre la risposta su stackoverflow.com/questions/1441699/… sembra più personalizzazione del necessario, è il modo documentato e, soprattutto, sembra essere più allineato al nostro intento.
trss,

6

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];  
}

3

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


Dovrebbe essere self.navigationController? .NavigationBar.backItem? .Title = "Testo personalizzato"
Peacemoon,

1
l'unica differenza di cui avevo bisogno era il concatenamento opzionale sulle proprietà navigationControllere topItem, ad esempio:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Bulwinkel,

2

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à retainl'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!


Nota in questi giorni, con ARC, non devi preoccuparti del rilascio automatico (e in effetti il ​​compilatore genererà un errore se provi a rilasciare automaticamente un progetto abilitato per ARC)
Eric Goldberg,

2
- (void)viewDidLoad {
  [super viewDidLoad];

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

2

Ho scoperto qualcosa di interessante. Se esegui la sottoclasse del UINavigationControllere 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 ViewControllersciò 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 backButtonTexto 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.


0

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.


0

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.


0

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];

0

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.


0

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)

-1

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.