Come modificare il testo su un pulsante Indietro


90

Per impostazione predefinita, il pulsante Indietro utilizza come testo su di esso il titolo di un viewcontroller. Posso modificare il testo sul pulsante Indietro senza modificare il titolo di un controller di visualizzazione? Ne ho bisogno perché ho un controller di visualizzazione il cui titolo è troppo lungo da visualizzare e in questo caso vorrei visualizzare solo "Indietro" come didascalia per il pulsante Indietro.

Ho provato quanto segue che non ha funzionato:

self.navigationItem.leftBarButtonItem.title = @"Back";

Grazie.


3
Tieni presente che i pulsanti Indietro hanno titoli per un motivo. Modificando il titolo in "Indietro" stai derubando l'utente di informazioni su ciò a cui torna il pulsante.
Simon

Risposte:


167

Provare

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

L'ho scoperto guardando i documenti backBarButtonItem nei documenti di Apple per UINavigationItem .


1
Mi spiace, non ho la possibilità di testarlo in questo momento, ma questo applica la forma a punta sinistra dei pulsanti Indietro incorporati o mantiene la forma rettangolare predefinita di UIBarButtonItem?
Marco

In realtà non ne sono sicuro. Presumo che manterrebbe automaticamente la forma del pulsante Indietro poiché stai impostando la proprietà backButton, ma dovresti testarlo per scoprirlo. Anch'io sono curioso.
Marc W

2
Sì, ha funzionato! Sì, cambia il titolo e sì, salva la forma. Grazie dell'aiuto.
Ilya Suzdalnitski

1
Nota: il pulsante Indietro viene mantenuto due volte [1x dall'allocazione, 1x dal mantenimento della proprietà]. Tuttavia, se non cambi il pulsante Indietro, è effettivamente innocuo.
Kelvin

29
Vedi il commento di Marco di seguito: dovresti chiamarlo sul controller che sta per spingere qualcosa di nuovo, non sul controller che viene spinto.
Fattura

97

L'approccio di Marc W ha funzionato alla grande una volta che ho capito a quale controller applicarlo: quello che è stato rinominato, non quello in cima. Quindi, se questo è lo stack di navigazione:

(bottom)  ControllerA -> ControllerB  (top)

... e vuoi dare un titolo più breve per ControllerA nel pulsante Indietro visualizzato quando ControllerB è in alto , applichi la modifica della proprietà a ControllerA .

Quindi è più nel contesto di self.title, non come gli altri setter di pulsanti sinistra / destra.


13
Questo è un dettaglio molto importante.
Bill

4
wcochran, funziona con lo storyboard, assicurati solo di impostare il pulsante Indietro del controller principale. Quindi, se hai il controller A che punta al controller B (tramite storyboard segue), per personalizzare il testo per il pulsante Indietro nel controller B, devi impostare la proprietà "Pulsante Indietro" per il controller A nell'editor dello storyboard.
interrompe il

Grazie Marco. Quello che ho sentito riguardo a questa domanda è che tutti cercano di rispondere (e rispondere correttamente) ma non per la domanda che viene posta. Fondamentalmente hai colpito il chiodo in testa e correttamente. Grazie per quello!
theiOSguy

+1 per dettagli importanti. La risposta di cui sopra non funzionerà per te a meno che tu non comprenda QUESTA risposta.
baptzmoffire

Hai ragione, la tastiera del nuovo MacBook One è un po 'difficile da abituarsi.
Mason G. Zhwiti

48

Puoi farlo nello storyboard. Trova il controller della vista a cui vuoi tornare (quello con il titolo lungo), seleziona l'elemento di navigazione e apri l'ispettore degli attributi (Alt + Cmd + 4), inserisci il titolo personalizzato del pulsante Indietro.

inserisci qui la descrizione dell'immagine


Questo era esattamente ciò di cui avevo bisogno poiché volevo che tutti i pulsanti Indietro avessero il testo "Indietro" invece dei titoli di navigazione del controller precedente.
Dave

8
Solo per notare, il testo del pulsante Indietro è impostato sulla vista da cui è stato spinto il controller successivo, non sul controller di visualizzazione che hai attualmente mostrato.
Darbio

Questa è una buona soluzione semplice, ma per favore non rinominare tutti i pulsanti Indietro in "Indietro", va contro l'HIG di Apple e annulla parte dello scopo di un pulsante Indietro. :(
Samuel Goodwin

Ha funzionato alla grande. Assicurati solo di SALVARE il file Storyboard. Il mio primo tentativo non ha funzionato perché non ho notato che lo Storyboard non era stato salvato! E sì, cambi il pulsante INDIETRO sul controller della vista da cui provieni!
EricWasTaken

Molto bene, ma se volessi lasciare solo una freccia, senza testo? :)
Iurii Vasylenko

40

Grazie Marco ... che mi ha aiutato ...

Ecco cosa ho fatto.

Se stai usando un tableView per navigare in diverse viste ... inserisci il codice:

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

Nel tuo didSelectRowAtIndexPathmetodo ... del primo Controller ... Controller A.

Quando navighi nel Controller B, il pulsante avrà il titolo "Indietro".


1
Grazie caro @Ben. Era esattamente quello che stavo cercando :).
Arslan

12

Il pulsante Indietro estrae il testo dal titolo del controller della vista genitore.

Nel controller della vista padre (il controller della vista che appare quando tocchi il pulsante Indietro), imposta il proprio titolo come testo desiderato sul pulsante Indietro.

Ad esempio, supponiamo di avere una RootViewControllerclasse. Quando facciamo clic su una cella nella sua vista tabella, eseguiamo il push di un'istanza di SecondViewController. Vogliamo che il pulsante Indietro SecondViewControllerdell'istanza legga "Home".

nel viewDidLoadmetodo di RootViewController.m :

self.title = @"Home";

nel viewDidLoadmetodo di SecondViewController.m :

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

Se vuoi che il tuo pulsante Indietro legga "Indietro", imposta il titolo del controller della vista genitore su @"Back";


10

Questo funziona meglio per me. Provare :

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];

1
Ottima risposta ha funzionato perfettamente. dovrebbe essere contrassegnato come escluso.
Muhammad Rizwan

9

Se stai usando lo storyboard:

  1. Apri StoryBoard
  2. Nella finestra Struttura del documento trova ViewController a cui vuoi tornare
  3. Fare clic sull'elemento di navigazione di quel ViewController
  4. In Esplora attributi modifica il valore del pulsante Indietro nel riquadro personalizzato

Questo è tutto, divertiti ...


5

E in MonoTouch funziona quanto segue (in ViewDidLoad del controller principale):

NavigationItem.BackBarButtonItem = new UIBarButtonItem( "Back", UIBarButtonItemStyle.Plain, null);

3
[self.navigationItem setBackBarButtonItem:[[UIBarButtonItem alloc]
  initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:nil action:nil]];

Questo ha funzionato per me.


3

Nel controller della vista genitore, imposta il pulsante Indietro quando viene caricata la vista:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    self.navigationItem.backBarButtonItem = 
       [[UIBarButtonItem alloc] initWithTitle:@"title" 
                                        style:UIBarButtonItemStylePlain 
                                       target:nil 
                                       action:nil];

}

Si noti che non è necessario includere autoreleasealla fine con l'ultima versione di iOS.

Spero che questo ti aiuti!


1

[self.navigationController.navigationBar.backItem setTitle:@"back"];

Per me funziona. Puoi sostituire "back" con qualcos'altro.


Quando si risponde con il codice, spiegare sempre qual era il problema con il codice fornito e come il codice risolve il problema.
Lukas Knuth

1

Questo ha funzionato per me se non vuoi avere un titolo!

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

1
self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];

0

Alla fine ho capito perché queste risposte all'inizio non funzionavano per me. Ho impostato il titolo nello storyboard. Quando ho impostato il titolo su codice. Funziona!

self.navigationItem.title = @"Main Menu";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStyleBordered target:nil action:nil];
[[self navigationItem] setBackBarButtonItem:backButton];

In futuro potresti voler inserire post come questo come commenti sulla risposta che non ha funzionato per te.
Keith Smiley

0

La mia soluzione era impostare il titolo quando il controller di visualizzazione viene inviato allo stack di navigazione e ripristinarlo utilizzando il metodo delegato prima della chiusura di vc push:

Quindi ho inserito il cambio di titolo nella chiamata del controller di visualizzazione quando spingo l'altro controller di visualizzazione come:

self.pushedVC = [self.storyboard instantiateViewControllerWithIdentifier:@"pushedVCIdentifier"];
self.pushedVC.delegate = self;   
[self.navigationController pushViewController:self.pushedVC animated:YES];
self.title = @"Back";

e nella funzione di callback delegato (che invoco in viewWillDissapear):

-(void)pushedVCWillClose:(PushedVC *)sender
{
    self.title = @"Previous Title";
}

0

Se non vuoi solo cambiare il testo del pulsante Indietro e mantenere la forma originale della freccia sinistra, ma anche fare qualcosa quando l'utente fa clic sul pulsante Indietro, ti consiglio di dare un'occhiata al mio " CustomNavigationController ".


0

// È possibile ottenere ciò impostando il titolo nel controller di visualizzazione precedente come mostrato di seguito

override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        //Set Title for this view
        self.navigationItem.title = "My Title"

}

override func viewWillDisappear(animated: Bool) {
        super.viewWillAppear(animated)
        //Set Title for back button in next view 
        self.navigationItem.title = "Back"
}

0

Per modificare il titolo del pulsante Indietro, fare riferimento al codice sottostante

InformationVC *infoController=[[InformationVC alloc]init];[self.navigationController infoController animated:YES];

//Below code changed back button title on InformationVC page.
UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Information" style: UIBarButtonItemStylePlain target: nil action: nil];
self.navigationItem.backBarButtonItem = backBarButton;`enter code here`


-1

Questo ha funzionato per me:

self.navigationController.navigationBar.topItem.title = "Back"
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.