Domanda

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

È stato utile?

Soluzione

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 nella vista   controller che vedresti se premi il pulsante Indietro

Altri suggerimenti

Puoi 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 in codice come nella risposta accettata.

  

Inoltre, è necessario eseguire questa operazione nel controller di visualizzazione di un livello superiore   pila. In altre parole, non farlo nel controller della vista visibile,   ma nel controller di visualizzazione che vedresti se premi il pulsante Indietro.
   - Tyler

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 , in questo modo:

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

Funziona perché il comportamento predefinito di UINavigationController durante la costruzione del 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

Aggiunta 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 l'istanza che la supera, che non viene mai rilasciata in modo esplicito. Puoi rimediare usando autorelease

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

Oppure potresti puntare una variabile sull'istanza in modo da poterla rilasciare esplicitamente in seguito:

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

Spero che questo aiuti!

- (void)viewDidLoad {
  [super viewDidLoad];

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

Ho scoperto qualcosa di interessante. Se esegui la sottoclasse del UINavigationController e sovrascrivi il metodo pushViewController: animato: 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 tutti i ViewControllers che vengono inviati con il controller di navigazione avrà il " Indietro " pulsante in loro automaticamente. 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 come backButtonText o qualcosa del genere sciocco come quello) che può darti alcune informazioni sul telecomando che sta arrivando in modo che tu possa personalizzare il testo del pulsante indietro per esso. 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 devi armeggiare con i titoli del controller di visualizzazione o devi ricordare di creare un nuovo pulsante Indietro prima di premere il viewcontroller sul controller di navigazione.

la risposta di Rein funziona bene.

Nota che se premi più di un controller di visualizzazione, il titolo del pulsante Indietro modificato verrà visualizzato per ognuno di essi, che potrebbe non essere quello che desideri.

In tal caso, dovrai creare UIBarButtonItem personalizzato ogni volta che premi un controller di visualizzazione.

Inoltre, assicurati di farlo prima premendo il controller di visualizzazione, altrimenti otterrai un singhiozzo dello schermo quando il titolo cambia.

Espandendo il suggerimento di Aubrey, puoi farlo nel controller della vista figlio:

crea due variabili per archiviare i vecchi valori di navigationItem.title del genitore e di navigazioneItem del genitore

UINavigationItem* oldItem;
NSString* oldTitle;

in viewDidLoad , aggiungi quanto segue:

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

in viewWillDisappear , aggiungi 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 si desidera impostare il titolo nel controller ARRIVO (a volte più logica ..) in 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
        }
    })

}

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:

ovvero 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 ognuna delle tue visualizzazioni, puoi impostare il titolo del retro in StoryBoard .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top