2009-09-17 14 views

Respuesta

334

De this link:

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

Como se ha dicho Tyler en los comentarios:

no hacerlo en el controlador de vista visible, pero en la vista controlador que verías si presiona el botón Atrás

+4

Deberías 'lanzar' el' UIBarButtonItem'. –

+213

También tenga en cuenta que debe hacer esto en el controlador de vista un nivel arriba de la pila. En otras palabras, no haga esto en el controlador de vista visible, sino en el controlador de vista que verá si presiona el botón Atrás. – Tyler

+0

Muchas gracias Tyler. ¡Tu comentario me ahorró mucho tiempo! –

11

Encontré una solución práctica para th está poniendo simplemente el título del controlador antes de empujar otro controlador en la pila, así:

self.navigationItem.title = @"Replacement Title"; 
[self.navigationController pushViewController:newCtrl animated:YES]; 

A continuación, asegúrese de establecer el título original en viewWillAppear, así:

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

Este funciona porque el comportamiento predeterminado de UINavigationController al construir el botón Atrás durante una operación de inserción es usar el título del controlador anterior.

+1

El problema con esto es el cambio de título en la vista anterior a medida que se anima y se ve un poco malo Ninguna de las soluciones dadas aquí parece funcionar como te gustaría :-( –

+1

Esto es perfecto en mi situación porque no muestro NavBar en la pantalla anterior y solo quiero quitar el títuloLabel del botón de retroceso en el nueva pantalla y solo tiene la flecha de chevron iOS7. Por lo tanto, puedo simplemente establecer un NSString literal vacío para el título. – siburb

+0

empujar el controlador de vista elevar la excepción cuando toque – Sumit

0

Ampliando la sugerencia de Aubrey, se puede hacer esto en el controlador de vista del niño:

crean dos variables para almacenar los viejos valores de navigationItem.title de los padres y navigationItem de los padres

UINavigationItem* oldItem; 
NSString* oldTitle; 

en viewDidLoad , añada lo siguiente:

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

en viewWillDisappear, añada lo siguiente:

[oldItem setTitle: oldTitle]; 
oldTitle = nil; // do this if you have retained oldTitle 
oldItem = nil; // do this if you have retained oldItem 

No es perfecto. Verá que el título de la vista principal cambia a medida que el nuevo controlador está animado. PERO esto logra el objetivo de etiquetar de forma personalizada el botón Atrás y mantenerlo en forma de botón de respaldo estándar.

21

utilizo este:

// 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"; 
} 
+0

Esto casi me funciona, pero cuando hago clic en el botón Atrás, el texto cambia al título del padre durante la duración de la animación :-( –

+3

Esto cambia el título del botón Atrás del controlador en la pila. No cambia el título del botón Atrás del controlador que se muestra actualmente. Par peor: ¡cambia el título del controlador anterior al controlador anterior! – leviathan

+0

A s señalado por otros comentaristas, este método es un poco insostenible. No recomendaría hacer esto, ya que no es realmente cómo la API pretende que lo uses. ¡Podrías prepararte para errores difíciles en el futuro! – RickDT

6

en su método init, añada el siguiente código:

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

continuación, agregue un método sencillo, para permitir viewcontroller Dismissing:

-(void)goBack { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
2

Agregando a la respuesta de rein. Nota de documentos de Apple que la declaración de backBarButtonItem es la siguiente:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem 

Por lo tanto, la respuesta de rienda perderá memoria debido a que el colocador sintetizada retain la instancia se le pasa, que nunca se libera de forma explícita.Usted puede remediar esto mediante el uso autorelease

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

O usted podría señalar una variable en la instancia para que pueda liberar explícitamente más adelante:

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

Espero que esto ayude!

+0

Nota en estos días, con ARC, no necesita preocuparse por la liberación automática (y de hecho el compilador tendrá un error si intenta liberar automáticamente en un proyecto habilitado para ARC) –

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

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

rein la respuesta funciona bien.

Tenga en cuenta que si pulsa más de un controlador de vista, el título del botón Atrás modificado aparecerá para cada uno de ellos, que puede no ser lo que desea.

En ese caso, deberá crear el UIBarButtonItem personalizado cada vez que presione un controlador de vista.

Además, asegúrese de hacerlo antes de presionando el controlador de vista, de lo contrario, obtendrá un error de pantalla a medida que cambie el título.

7

El título del botón Atrás está predeterminado para el título de la vista anterior, por lo que un truco rápido que uso es colocar el siguiente código en el archivo .m de la vista anterior.

-(void)viewWillAppear:(BOOL)animated { 

    // Set title 
    [email protected]"Original Title"; 
} 

-(void)viewWillDisappear:(BOOL)animated { 

    // Set title 
    [email protected]"Back"; 
} 
+0

Esto funciona bastante bien para muchos casos, es bastante simple ... la única observación es que anular cualquiera de estos métodos requiere que se llame a la implementación del super en algún punto del nuevo método. – izk

+2

Con este método, uno notará que el título de la vista principal cambia a 'Atrás' antes de que se produzca la animación de inserción. (Y, por cierto, es una mierda, que si mueves esto al método viewDidDisappear, verás que el interruptor está sucediendo después del empuje ...) –

+0

Me encanta este método, pero el problema que enfrento con esto es que se establece el "Título original" bien, pero viene con puntos suspensivos si es más largo que "Atrás", lo cual debe ser porque, dado que la vista aún no está en la jerarquía de vistas, no retransmite la vista del título. El problema descrito por @JamesBoutcher anterior es imperceptible para mí debido a la rápida velocidad inicial de la animación.De hecho, me acabo de dar cuenta de que el problema que enfrento es especialmente notable debido a la animación de finalización lenta, que es cuando este problema es prominente. – trss

2

Descubrí algo interesante. Si la subclase UINavigationController y reemplaza el método pushViewController:animated: y hacer algo como esto: (tenga en cuenta que estoy usando ARC)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
initWithTitle: @"Back" 
style: UIBarButtonItemStyleBordered 
target: nil action: nil]; 

viewController.navigationItem.backBarButtonItem = backButton; 

[super pushViewController:viewController animated:animated]; 

Entonces para todos ViewControllers que son empujadas con su controlador de navegación dispone de " Atrás "botón en ellos automáticamente. Si desea cambiar el texto de ciertos controladores de vista, puede intentar y quizás lanzar el controlador de vista a cierta clase o su propio protocolo personalizado (que su controlador de vista hereda de la cual podría tener un método como backButtonText o algo así de tonto) que puede dar usted tiene cierta información sobre el controlador de vista que viene para que pueda personalizar el texto del botón de retroceso para él. Ahora, el texto del botón de retroceso se atiende en un lugar que debe ser el único responsable. Debo admitir que crear un nuevo botón para cambiar el texto apesta, pero bueno.

¿Alguien puede pensar en una razón para no hacerlo así? Por lo menos, no tiene que jugar con los títulos del controlador de visualización o tiene que recordar crear un nuevo botón de retroceso antes de presionar el controlador de visualización en el controlador de navegación.

0

poner esto en que viewDidLoad, espero que resultará en lo que busca

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

Puede establecer el texto en el Generador de Interfaz:

Seleccione el elemento de navegación de la ViewController que la botón trasero volvería a:

enter image description here

En el atributo panel de utilidades Inspecto r, introduzca su etiqueta para el botón Atrás:

enter image description here

yo preferiría este enfoque sobre el establecimiento del título en el código como en la respuesta aceptada.

También tenga en cuenta que debe hacer esto en el controlador de vista un nivel arriba de la pila . En otras palabras, no haga esto en el controlador de vista visible, , sino en el controlador de vista que verá si presiona el botón Atrás.
--Tyler

+0

Esta es la mejor respuesta que encontré hasta ahora. –

+2

Para ser claros, esto debe establecerse en el elemento de navegación del controlador de vista, no en el inspector de atributos del controlador de vista. –

+0

Esta es la mejor respuesta que encontré. – bicepjai

-1

Hacer esto en el código de quitar el estilo botón de retroceso de la UINavigationConroller. Si agrega un ítem de navegación en cada una de sus vistas, puede establecer el título del botón de fondo en el StoryBoard.

2

Agregue el código siguiente en viewDidLoad o loadView

self.navigationController.navigationBar.topItem.title = @"Custom text"; 

he comprobado en iPhone y iPad con iOS 9

+0

Debería ser self.navigationController? .navigationBar.backItem? .title = "Texto personalizado" – Peacemoon

+0

La única diferencia que necesitaba era el encadenamiento opcional en las propiedades 'navigationController' y' topItem', por ejemplo: 'self.navigationController? .navigationBar.topItem? .title =" Texto personalizado "' – Bulwinkel

0

Si desea establecer título en llegar controlador (a veces más lógica ..) en swift 3 hacer:

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 
     } 
    }) 

} 

en la próxima controlador:

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.setBackButtonNavBar(title: "back", delay: 0.3) 
} 

generalmente puse self.setBackButtonNavBar en una extensión de controlador.

Cuestiones relacionadas