Domanda

Attualmente la barra a sinistra del pulsante il valore di default è il titolo della vista che ha caricato l'attuale, in altre parole la vista per essere mostrato quando il pulsante è premuto (pulsante indietro).

Voglio cambiare il testo visualizzato sul pulsante per qualcos'altro.

Ho provato a mettere la seguente riga di codice nella vista del controller metodo viewDidLoad ma non sembra funzionare.

self.navigationItem.leftBarButtonItem.title = @"Log Out";

Cosa devo fare?

Grazie.

È stato utile?

Soluzione

Questo deve essere collocato nel metodo che chiama il ViewController dal titolo "newTitle". Proprio prima dell'istruzione push o popViewController.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];

Altri suggerimenti

In ChildVC questo ha funzionato per me ...

self.navigationController.navigationBar.topItem.title = @"Back";

Opere a Swift troppo!

self.navigationController!.navigationBar.topItem!.title = "Back"

Ecco la documentazione per backBarButtonItem :

  

"Quando questa voce di navigazione si trova subito sotto la prima voce nella   pila, il controller di navigazione deriva il pulsante indietro per il   barra di navigazione da questa voce di navigazione. [...] Se lo desidera   specificare un'immagine personalizzata o un titolo per il tasto posteriore, è possibile assegnare un   elemento pulsante della barra personalizzata (con il titolo personalizzato o immagine) di questa   proprietà invece. "

View Controller A ( "genitore" View Controller):

self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

Quando qualsiasi altro controller della vista B è in cima alla pila di navigazione, e A è proprio sotto di esso, pulsante Indietro B s ' avrà il titolo "Short" .

in Xcode 4.5 utilizzando storyboard, di gran lunga la soluzione più semplice che ho trovato quando il valore del pulsante Indietro non deve cambiare in modo dinamico è quello di utilizzare il campo "pulsante Indietro" associato alla voce di navigazione del controller View a cui si desidera che il pulsante "Indietro" per dire qualcosa di diverso.

es. nello screenshot qui sotto, voglio il pulsante Indietro per il controller della vista (s), che mi spingono ad avere "Back", come il titolo del pulsante Indietro.

entrare descrizione dell'immagine qui

Naturalmente, questo non funzionerà se è necessario il pulsante indietro per dire qualcosa di leggermente diverso ogni volta ... ci sono tutte le altre soluzioni qui per questo.

Lo so, la questione è molto vecchio, ma ho trovato una bella soluzione.

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

Opere dal childView! Testato con iOS 7.

Forse sono più semplicistico, ma Da Apple documentazione il testo è:

Se un personalizzato il pulsante della barra elemento non è specificato da una delle view controller, un di default pulsante indietro è utilizzato e il suo titolo è impostato sul valore del titolo di proprietà del precedente view controller—che è, il controller di visualizzazione di un livello basso nello stack.

La soluzione esatta al di sopra di un set di un pulsante predefinito voce dal controller padre.E ' la risposta giusta, ma sto risolvendo il problema modificando self.title proprietà di UIViewController a destra prima di spingere il nuovo controller sul NavigationController stack.

Questo aggiorna automaticamente il pulsante indietro per il titolo il prossimo controller, e come lungo come si imposta self.title tornato a quello che dovrebbe essere in viewWillAppear Non vedo questo metodo causando troppi problemi.

Questo lavoro meglio per me. Prova:

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

In Swift / iOS 8, di seguito ha lavorato per me:

let backButton = UIBarButtonItem(
      title: "Back Button Text",
      style: UIBarButtonItemStyle.Bordered,
      target: nil,
      action: nil
);

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

Porting dalla risposta di Felipe.

Ok, qui è la via. Se si dispone di un controller di vista "prima" e si naviga un altro controller vista "secondo" premendo un pulsante o ecc hai bisogno di fare un certo lavoro. In primo luogo è necessario creare un BarButtonItem nel metodo di viewDidLoad "secondo" punto di vista di controllo come questo;

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

Dopo aver fatto questo, è necessario scrivere al codice per l'azione "btnBack" nello stesso file .m come questo;

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}

Questo è tutto.

Ho avuto un controller di vista genitore con un tempo molto lungo titolo. Ciò ha provocato il testo del pulsante di nuovo sanguinamento nel titolo del controller della vista del bambino.

Dopo aver provato una serie di soluzioni diverse, questo è quello che ho finito per fare (espansione sull'approccio @ john.k.doe):

Utilizzando Xcode 7.2, Swift 2

  1. Nella Storyboard, aggiungere un Navigation Item alla principale scena View Controller (non il VC bambino)

navigazione voce

  1. Nella Attributes Inspector del nuovo Navigation Item, inserite una lettera space nel campo Back Button. Più su questo più tardi.

navigazione voce nella visualizzazione della gerarchia

add un carattere di spazio al campo pulsante Indietro

  1. Nel principale View Controller, aggiungere il seguente codice:

frammento di codice:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
    case is ChildViewController:
        navigationItem.backBarButtonItem?.title = ""
    default:
        navigationItem.backBarButtonItem?.title = "Full Parent Title"
    }
}

Spiegazione:

Il pulsante Indietro sorta di appartiene al controller della vista genitore. Il Navigation Item ti dà una maniglia per il pulsante indietro, in modo da poter impostare il titolo nel codice o nella Storyboard.

Nota:

Se si lascia il testo Navigation Item Back Button come la stringa vuota di default, il titolo pulsante Indietro diventerà "Indietro".

Altri approcci funzionano, perché usare questo:?

Mentre è possibile ignorare il titolo pulsante indietro sul controller di vista del bambino, è stata una sfida per ottenere una maniglia fino a quando non era già balenato brevemente sullo schermo.

Alcuni degli approcci costruire un nuovo pulsante indietro e sovrascrivere quello esistente. Sono sicuro che funziona, e probabilmente necessario in alcuni casi d'uso. Ma io preferisco sfruttare le API esistenti, quando possibile.

La modifica della title del controller vista padre è la soluzione più rapida per alcune situazioni. Tuttavia, questo cambia il titolo genitore in modo da avere per la gestione dello stato. Le cose anche ottenere disordinato con un Tab Bar Controller perché i cambiamenti di titolo causano effetti collaterali con i titoli Tab Bar Item.

Per coloro che utilizzano storyboard basta selezionare il genitore (non quello che sta tenendo vista di destinazione) telaio View Controller (assicuratevi si fa clic destro sulla barra di navigazione, quindi gli attributi aperti ispettore, dove troverete tre ingressi del modulo. Il "pulsante indietro" terzo è che stiamo cercando.

Versione Swift:

Nel vostro bambino ViewController:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}

Ecco un altro modo per farlo.

Nel vostro controller della vista genitore, implementare il metodo seguente:

- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
  self.navigationItem.backBarButtonItem.title = newTitle;
}

Nel vostro controller della vista bambino, quando si desidera cambiare il titolo, questo lavoro:

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

Non sono mai stato in grado di ottenere la proprietà parentViewController al lavoro:

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];

Non so se questo è un bug o non sto usando correttamente. Ma afferrando il secondo-a-ultima vista controllore nei punti di matrice viewControllers al controller vista primaria, e può chiamare metodi madri correttamente con tale riferimento.

ok.Io personalmente l'ho odiato tutte queste opzioni.E per questo sono venuto con la mia.

In base alle informazioni che ho visto.Sembra che il Precedente view controller è il controllo delle proprie pulsante "Indietro" che verrà presentato il spinto view controller.

Ho creato un Lazy Load metodo per la navigationItem sul controller che vuole l'cambiato di nuovo il Pulsante.

Il mio è un Invito Acquirente Controller

Invito l'Acquirente è il testo che è impostato di default.

ma il pulsante indietro necessari per essere Invitate

Ecco il codice che ho usato per creare il pulsante indietro.

Ho inserito questo codice nella parte superiore del Controller di Implementazione (.m) di file e si escludeva il super metodo automaticamente.

- (UINavigationItem *)navigationItem{
    UINavigationItem *item = [super navigationItem];
    if (item != nil && item.backBarButtonItem == nil)
    {
        item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
        item.backBarButtonItem.title = @"Invite";
    }

    return item;
}

Sento che questo è un molto più elegante modo per eseguire questa operazione.

Ho posto questo codice in un unico luogo, e automaticamente viene compilato quando necessario.

Non c'è bisogno di chiamare il codice prima di ogni pressione richiesta.

Spero che questo aiuta

UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

Ecco la risposta:

In viewDidAppear:animated (NON in viewDidLoad) effettuare le seguenti

- (void)viewDidAppear:(BOOL)animated
{
     [self.navigationController.navigationBar.backItem setTitle:@"anything"];

     // then call the super
     [super viewDidAppear:animated];
}

Che, se si vuole mantenere la forma del tasto back.

Nessuna delle soluzioni spiegato qui ha funzionato per me. Quindi quello che ho fatto è stato rimuovere il titolo dalla scena dove sono venuto nel seguente modo:

self.title = @"";

Così, quando nuova scena viene presentato il testo di nuovo non viene visualizzato.

I absoluty d'accordo che questo non è una soluzione chiara a tutti, ma lavorato e nessuno dei spiegato lavorato per me.

Per Swift:

    // Rename back button
    let backButton = UIBarButtonItem(
        title: "Back",
        style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
        target: nil,
        action: nil
    )
    self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton

che ho trovato, che il modo più semplice per cambiare il nome del pulsante di nuovo è quello di impostare il titolo della vista controller per il titolo del pulsante indietro, e poi sostituendo la titleView nella voce di navigazione vista controller per un'etichetta personalizzata con il suo vero nome.

In questo modo:

CustomViewController.m

@implementation CustomViewController

- (NSString*)title {
    return @"Back Button Title";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
    customTitleView.text = @"Navigation Bar Title";
    customTitleView.font = [UIFont boldSystemFontOfSize:20];
    customTitleView.backgroundColor = [UIColor clearColor];
    customTitleView.textColor = [UIColor whiteColor];
    customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    customTitleView.shadowOffset = CGSizeMake(0, -1);

    [customTitleView sizeToFit];

    self.navigationItem.titleView = [customTitleView autorelease];
}

@end

Questo renderà il vostro titolo in UINavigationBar sembrare come se fosse nativo. Dare il controller della vista la possibilità di avere separati titolo e il titolo pulsante indietro.

Nel caso di vista del regolatore A e B, A è responsabile per raccontare come è di nuovo il tasto dovrebbe guardare, mentre viene visualizzato B.

EDIT: Questo mantiene anche l'aspetto nativo pulsante Indietro (La sinistra dalla freccia elemento pulsante della barra)

.

Questo codice funziona anche. Mettere questo sul controller principale del controller di navigazione:

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

Ho trovato che è meglio cambiare il titolo della corrente controller della vista nella pila di navigazione per il testo desiderato del pulsante indietro prima di spingere al successivo controller della vista.

Per esempio

self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];

Poi nel viewDidAppear impostare il titolo di nuovo al titolo desiderato per la VC originale. Voila!

Im nuovo in iOS, ma io forniranno il mio molto semplice risposta di rilevante della classe controller di navigazione. Ho semplice override dei metodi push e pop e salvare il titolo del precedente controller della vista. Ci scusiamo per incollare nel blocco js. Era po 'confuso come passato nel blocco di codice normale.

#import "MyCustomNavController.h"


@implementation MyCustomNavController {

    NSString *_savedTitle;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
    _savedTitle = self.topViewController.title;

    self.topViewController.title = title;
    [super pushViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {

    [self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
    return [super popViewControllerAnimated:animated];
}

@end

self.navigationController.navigationBar.backItem.title = @"TEXT";

E in Swift:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

si può mettere dovunque ti piace nel codice nel controller parrent, che si allowes avere backbuttons differenct per diversi punti di vista dei bambini.

La maggior parte delle soluzioni uccide lo stile originale della BackButton (pulsante della barra La sinistra arrowed) mentre l'aggiunta di un pulsante di consueto con il titolo desiderato.
Quindi, per mantenere lo stile originale ci sono 2 modi:
1 °: per utilizzare lo stile del pulsante non documentato (110 o qualcosa di simile), che preferisco non fare. Ma se si vuole si potrebbe trovare come farlo qui, su StackOverflow.
2 °: Per utilizzare ho idea del Trenskow. Mi è piaciuto e lo uso un po 'cambiato.
Invece di rilevante - (NSString *) Titolo Ho deciso di mantenere il titolo originale nel modo seguente (che mi permette di usare i titoli di pennini così come determinato titolo in stato di spinta btw)

.
- (void)viewDidLoad {
    [super viewDidLoad];
    static NSString * backButtonTitle=@"Back"; //or whatever u want

    if (![self.title isEqualToString:backButtonTitle]){

        UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
        customTitleView.text = self.title; // original title
        customTitleView.font = [UIFont boldSystemFontOfSize:20];
        customTitleView.backgroundColor = [UIColor clearColor];
        customTitleView.textColor = [UIColor whiteColor];
        customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
        customTitleView.shadowOffset = CGSizeMake(0, -1);

        [customTitleView sizeToFit];

        self.navigationItem.titleView = [customTitleView autorelease];
        self.title = backButtonTitle; 
    }
}

Questa soluzione funziona bene e sembra nativo. Anche se usare nel metodo viewDidLoad impedisce esecuzione più di 1 ora.
Anche io ho provato una soluzione di Jessedc ma sembra male. Essa provoca visibili a titolo change user bar al volo da originale per BackButton di desiderata e ritorno.

Questo funziona per me come una versione "semplificata" delle risposte postato precedenti.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

Ricordate di inserire il codice all'interno del controller della vista genitore (per esempio l'idea che ha la vostra vista tabella o UITableViewController), non la vista del bambino o dettaglio (ad esempio UIViewController).

Si può facilmente localizzare la stringa pulsante indietro in questo modo:

backButton.title = NSLocalizedString(@"Back Title", nil);

Abbiamo A e B due di VC.

Se si desidera cambiare il titolo in B, scrivere questo codice in A

- (IBAction)goToBViewController:(UIButton *)sender {

    BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:nil
                                                                 action:nil];
    [[self navigationItem] setBackBarButtonItem:newBackButton];
    [self.navigationController pushViewController:vc animated:NO];

}

Swift 4.1 Xcode 9.4

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)

La risposta di Stan è stato il migliore. Ma hanno anche un problema, quando si utilizza il controller con una barra delle schede e cambiare il titolo del controller, è possibile cambiare il titolo del Tab Bar il too.So la risposta migliore è cambiare il view_controller.navigationItem.title solo ed utilizzare il view_controller.navigationItem .title nella funzione. La risposta è qui: (con l'arco e aggiungerli in viewDidLoad di vista)

  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }

In me stesso uso, faccio una funzione come questa, basta avere la funzione con il codice di una riga nel viewDidLoad.

+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }
}

Se si desidera non solo per modificare il testo del pulsante Indietro per lo stesso testo e rimane la forma freccia sinistra originale, ma anche di fare qualcosa quando l'utente fa clic sul pulsante Indietro, vi consiglio di dare un'occhiata in giro il mio " CustomNavigationController ".

PROBLEMA:"Indietro" del testo nella barra di navigazione non può essere sostituito.

MOTIVO:"Indietro" etichetta è impostato nella barra di navigazione dopo la spinta di una vista perché .attributo title nel genitore view controller è impostato a zero (o non inizializzato).

UNA SOLUZIONE:Se si imposta l'auto.title="Qualunque cosa..." vedrete che invece di "Indietro" appare "a Prescindere..." dopo aver premuto di nuovo controller di visualizzazione.

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