Pregunta

Actualmente, el valor predeterminado del botón de la barra izquierda es el título de la vista que cargó la actual, en otras palabras, la vista que se mostrará cuando se presione el botón (botón Atrás).

Quiero cambiar el texto que se muestra en el botón por otro.

Intenté poner la siguiente línea de código en el método viewDidLoad del controlador de vista pero no parece funcionar.

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

¿Qué tengo que hacer?

Gracias.

¿Fue útil?

Solución

Esta debe ser colocado en el método que llama a la ViewController titulado "newTitle". Justo antes de la inserción o popViewController comunicado.

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

Otros consejos

En ChildVC esto funcionó para mí ...

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

trabaja en Swift también!

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

Aquí está la documentación de backBarButtonItem

  

"Cuando este elemento de navegación se encuentra inmediatamente debajo del elemento superior de la   pila, el controlador de navegación deriva el botón de retroceso para el   barra de navegación de este elemento de navegación. [...] Si quieres   especificar una imagen personalizada o un título para el botón de retroceso, se puede asignar una   elemento de botón de la barra a medida (con su título personalizado o imagen) a este   propiedad en lugar ".

View Controller A ( "padre" controlador de vista):

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

Cuando cualquier otro controlador de vista B es en la parte superior de la pila de navegación, y es justo debajo de ella, botón de retroceso B 's tendrá el título "corto" .

en Xcode 4.5 usando guión gráfico, con mucho, la solución más fácil que he encontrado cuando el valor del botón Atrás no tiene que cambiar de forma dinámica es utilizar el campo "botón Volver" asociado con el elemento de navegación del controlador de vista a la que desea que el botón "Atrás" para decir algo más.

por ejemplo. en la pantalla de abajo, quiero el botón Atrás para el controlador (s) opinión de que i empujar tener "Back" como el título del botón Volver.

introducir descripción de la imagen aquí

Por supuesto, esto no funcionará si necesita el botón Atrás para decir algo ligeramente diferente cada vez ... hay todas las otras soluciones aquí para eso.

Lo sé, la cuestión es muy antigua, pero he encontrado una buena solución.

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

Las obras de childView! Probado con iOS 7.

Tal vez estoy siendo demasiado simplista pero a partir de la documentación de Apple la redacción es:

  

Si un costumbre elemento botón de la barra no se especifica por cualquiera de los controladores de vista, un botón por defecto posterior se utiliza y su título se establece en el valor del título característica de la vista anterior controlador, es decir, el nivel de controlador de vista uno abajo en la pila.

La solución correcta marcada anterior establece un elemento de botón predeterminado del controlador de matriz. Es la respuesta correcta, pero estoy resolver el problema cambiando la propiedad self.title del UIViewController justo antes de empujar el nuevo controlador en la pila NavigationController.

Esto actualiza automáticamente el título del botón Atrás de la siguiente controlador, y siempre y cuando se establece self.title de nuevo a lo que debería ser en viewWillAppear que no puede ver este método causando demasiados problemas.

Este trabajo mejor para mí. Proveedores:

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

En Swift / iOS8, la siguiente trabajó para mí:

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

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

portado de la respuesta de Felipe.

La autorización, aquí es el camino. Si tiene un controlador de vista "primero" y navega otro controlador de vista "segundo" pulsando un botón o etc que tenga que hacer algún trabajo. Lo primero que necesita para crear un BarButtonItem en el método viewDidLoad "segundo" del controlador de vista como éste;

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

Después de hacer eso, es necesario escribir el código para la acción "btnBack" en el mismo archivo .m como esto;

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

Eso es todo.

Yo tenía un controlador de vista de los padres con una muy larga título. Esto resultó en el texto del botón de nuevo sangrado en el título de la controlador de vista niño.

Después de probar un montón de diferentes soluciones, esto es lo que terminé haciendo (ampliando el enfoque @ john.k.doe):

Uso de Xcode 7.2, Swift 2

  1. En el guión gráfico, añadir un Navigation Item a la principal escena Vista Controlador (no el niño VC)

navegación objeto

  1. En la Attributes Inspector de su nuevo Navigation Item, introduzca un carácter space en el campo Back Button. Más sobre esto más adelante.

navegación Ver artículo en la jerarquía

add un carácter de espacio en el campo del botón Volver

  1. En el principal controlador de vista, agregue el código siguiente:

fragmento:

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

Explicación:

El botón de retroceso tipo de controlador pertenece a la vista padre. El Navigation Item le da un identificador para el botón de retroceso, por lo que puede definir el título en clave o en el guión gráfico.

Nota:

Si deja el texto Navigation Item Back Button como la cadena vacía por defecto, el título botón de retroceso se convertirá en "Volver".

Otros enfoques funcionan, ¿por qué usar este:?

Si bien es posible anular el título botón de retroceso en el controlador de vista del niño, fue un reto conseguir una manija a ella hasta que ya había brilló brevemente en la pantalla.

Algunos de los enfoques construir un nuevo botón atrás y anulan la existente. Estoy seguro de que funciona, y probablemente necesario en algunos casos de uso. Pero prefiero aprovechar las API existentes cuando sea posible.

Cambio de la title del controlador de vista de los padres es la solución más rápida para algunas situaciones. Sin embargo, esto cambia el título de los padres lo que tiene que administrar el estado. Las cosas también se complican con una Tab Bar Controller debido a los cambios de título causan efectos secundarios con los títulos Tab Bar Item.

Para aquellos que utilizan guiones gráficos sólo tiene que seleccionar el padre (no la que está sosteniendo vista de destino) marco de vista controlador (asegúrese de hacer clic derecho en la barra de navegación y, a continuación atributos abiertos inspector, donde encontrará tres entradas de formulario. La tercero botón "atrás" es que estamos buscando.

versión Swift:

En su hijo ViewController:

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

Aquí hay otra manera de hacerlo.

En el controlador de vista de los padres, poner en práctica el método siguiente:

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

En el controlador de vista del niño, cuando se quiere cambiar el título, esto va a funcionar:

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

Nunca fue capaz de conseguir la propiedad parentViewController a trabajar:

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

No sé si eso es un fallo, o que no lo estoy usando correctamente. Pero agarrar el segundo a último controlador de vista en los puntos de matriz viewControllers al controlador de vista padre, y puede llamar a los métodos de padres correctamente con esa referencia.

OK.Personalmente odiaba todas estas opciones.Por eso se me ocurrió el mío propio.

Según la información que he visto.Parece que el controlador de vista anterior tiene el control de su propio botón "Atrás" que se presentará en el controlador de vista empujado.

He creado un método de carga diferida para el elemento de navegación en el controlador que desea cambiar el botón Atrás.

El mío es un controlador de comprador por invitación

Invitar al comprador es el texto configurado de forma predeterminada.

pero el botón Atrás tenía que ser Invitar.

Aquí está el código que utilicé para crear el botón Atrás.

Coloqué este código en la parte superior del archivo Implementatio (.m) del Controlador y anuló el método del super automáticamente.

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

    return item;
}

Siento que esta es una forma mucho más elegante de lograr esto.

Coloco este código en un solo lugar y se completa automáticamente cuando es necesario.

No es necesario llamar al código antes de cada solicitud push.

Espero que esto ayude

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

Aquí está la respuesta:

En viewDidAppear:animated (NO en viewDidLoad) hacer lo siguiente

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

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

Eso si desea mantener la forma del botón de retroceso.

Ninguna de las soluciones que se explica aquí trabajó para mí. Así que lo que hice fue quitar el título de la escena donde vine de la siguiente manera:

self.title = @"";

Así que cuando se presenta nueva escena no aparece el texto de nuevo.

Me absoluty de acuerdo en que esto no es una solución clara en absoluto, pero trabajé y ninguno de los explicó trabajó para mí.

Para 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

he encontrado, que la manera más fácil de cambiar el nombre del botón de retroceso es para establecer el título a los controladores de vista el título del botón de retroceso, y volviendo a poner la titleview en el elemento de navegación controladores de vista de una etiqueta personalizada con su nombre real.

De esta manera:

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

Esto hará que su título en UINavigationBar parezca como si fuera nativa. Dando al controlador de vista la posibilidad de tener separados del título y el título botón de retroceso.

En el caso del controlador de vista A y B, A es responsable de decirle cómo está de nuevo el botón debe mirar, mientras se muestra B.

EDIT: Esto también mantiene el aspecto nativa botón de retroceso (El elemento botón de la barra izquierda flecha)

.

Este código también funciona. Poner esto en el controlador raíz del controlador de navegación:

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

He descubierto que lo mejor es cambiar el título del controlador de vista actual en la pila de navegación para el texto deseado del botón de retroceso antes de empujar al siguiente controlador de vista.

Por ejemplo

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

A continuación, en el viewDidAppear establecer el título de nuevo al título deseado para el VC originales. Voila!

soy nuevo en IOS, pero voy a dar mi respuesta muy simple de anular la clase controlador de navegación. Tengo override sencilla el empuje y pop métodos y guardar el título del anterior controlador de vista. Lo sentimos para pegar en el bloque js. Era poco confundido cómo pasado en el bloque de código normal.

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

Y en Swift:

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

se puede poner dondequiera que usted desee en el código en el controlador parrent, que allowes tener backbuttons differenct para diferentes puntos de vista del niño.

La mayoría de las soluciones mata el estilo original de BackButton (La izquierda arrowed botón de la barra) al tiempo que añade un botón de costumbre con título deseado.
Así que para mantener el estilo original hay 2 maneras:
Primero: Para usar estilo de botón indocumentado (110 o algo así) que prefiero no hacerlo. Pero si lo desea, puede encontrar cómo hacerlo aquí, en StackOverflow.
Segunda: Para utilizar la idea de que la Trenskow. Me gustó y lo uso un poco cambiada.
En lugar de anular - (NSString *) del título que he decidido mantener el título original de la siguiente manera (que me permite utilizar títulos de plumillas, así como título dado en el estado de empuje por cierto)

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

Esta solución funciona bien y se ve nativa. Además, si lo utilizan en el método viewDidLoad que impide la ejecución de más de 1 hora.
También he intentado una solución de Jessedc pero se ve mal. Se hace visible para el usuario el cambio de título barra sobre la marcha del original a la BackButton del deseada y la espalda.

Esto funciona para mí como una versión "simplificada" de las respuestas publicadas anteriores.

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

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

Recuerde poner el código dentro del controlador de vista de los padres (por ejemplo, la opinión de que tiene su vista de tabla o UITableViewController), no el punto de vista del niño o de detalle (por ejemplo UIViewController).

Puede localizar fácilmente la cadena botón de retroceso de esta manera:

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

Tenemos A y B dos de VC.

Si desea cambiar el título en B, escriba este código en un

- (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 respuesta de Stan fue la mejor. Pero también tiene un problema, cuando se utiliza el controlador con una barra de pestañas y cambiar el título del controlador, puede cambiar el título de la barra de pestañas too.So la mejor respuesta es cambiar el view_controller.navigationItem.title única y utilizar el view_controller.navigationItem .title en la función. Respuesta está aquí: (Con ARC y añadirlos en viewDidLoad de 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;
  }

En mismo uso, lo hago una función como esta, sólo tienen la función con una línea de código en el 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;
  }
}

Si desea no sólo para cambiar el texto del botón Atrás para el mismo texto y seguir siendo la forma de flecha izquierda original, sino también para hacer algo cuando el usuario hace clic en el botón Atrás, os recomiendo echar un vistazo alrededor de mi " CustomNavigationController ".

PROBLEMA:El texto "Atrás" en la barra de navegación no se puede reemplazar.

RAZÓN:La etiqueta "Atrás" se establece en la barra de navegación después de enviar una vista porque el atributo .title en el controlador de vista principal se configuró en nulo (o no se inicializó).

UNA SOLUCIÓN:Si configura self.title="Lo que sea..." verá que en lugar de "Atrás" aparecerá "Lo que sea..." después de presionar el nuevo controlador de vista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top