Pregunta

El " botón de retroceso " de un UINavigationController por defecto muestra el título de la última vista en la pila. ¿Hay alguna forma de tener texto personalizado en el botón de retroceso?

¿Fue útil?

Solución

De este enlace :

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

Como dijo Tyler en los comentarios:

  

no haga esto en el controlador de vista visible, sino en la vista   controlador que vería si presiona el botón Atrás

Otros consejos

Puede configurar el texto en el Creador de interfaces:

Seleccione el elemento de navegación del ViewController al que volvería el botón Atrás:

ingrese la descripción de la imagen aquí

En el inspector de atributos del panel de utilidades, ingrese su etiqueta para el Botón Atrás:

ingrese la descripción de la imagen aquí

Preferiría este enfoque a configurar el 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 más arriba   apilar. En otras palabras, no haga esto en el controlador de vista visible,   pero en el controlador de vista que verías si presionas el botón Atrás.
  --Tyler

Yo uso esto:

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

Encontré una solución práctica para esto simplemente configurando el título del controlador antes de insertar otro controlador en la pila, de esta manera:

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

Luego, asegúrese de establecer el título original en viewWillAppear , de esta manera:

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

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

El título del botón Atrás está predeterminado al 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
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

en su método init, agregue 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;
}

luego agregue un método simple, para permitir el descarte del controlador de vista:

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

Agregue el siguiente código en viewDidLoad o loadView

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

Lo probé en iPhone y iPad con iOS 9

Agregando a la respuesta de rein. Tenga en cuenta de los documentos de Apple que la declaración de backBarButtonItem es esta:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

Por lo tanto, la respuesta de rein perderá memoria porque el setter sintetizado retendrá la instancia que la pasa, que nunca se libera explícitamente. Puede remediar esto usando autorelease

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

O podría apuntar una variable a la instancia para poder liberarla explícitamente más tarde:

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

¡Espero que esto ayude!

- (void)viewDidLoad {
  [super viewDidLoad];

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

He descubierto algo interesante. Si subclasifica el UINavigationController y anula el método pushViewController: animated: y hace 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 los ViewControllers que se empujan con su controlador de navegación tendrá el " Atrás " abotone en ellos automáticamente. Si desea cambiar el texto de ciertos controladores de vista, puede probar y tal vez convertir el controlador de vista a una determinada clase o su propio protocolo personalizado (que su controlador de vista hereda del cual podría tener un método como backButtonText o algo así tonto como ese) que puede darle cierta información sobre el controlador de vista que viene para que pueda personalizar el texto del botón de retroceso. Ahora el texto del botón de retroceso se ocupa en un lugar que debe ser el único responsable. Tengo que admitir que crear un nuevo botón para cambiar el texto apesta, pero bueno.

¿Alguien puede pensar en una razón por la que no hacerlo así? Al menos, no tiene que jugar con los títulos del controlador de vista ni recordar crear un nuevo botón de retroceso antes de presionar el controlador de vista en el controlador de navegación.

la respuesta de rein funciona bien.

Tenga en cuenta que si presiona más de un controlador de vista, aparecerá el título del botón de retroceso modificado 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 presionar el controlador de vista, de lo contrario, se producirá una falla en la pantalla a medida que cambie el título.

Ampliando la sugerencia de Aubrey, puede hacer esto en el controlador de vista secundario:

crea dos variables para almacenar los valores antiguos del elemento de navegación principal del objeto y el elemento de navegación del elemento principal

UINavigationItem* oldItem;
NSString* oldTitle;

en viewDidLoad , agregue lo siguiente:

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

en viewWillDisappear , agregue 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 se anima el nuevo controlador. PERO esto logra el objetivo de etiquetar de forma personalizada el botón Atrás y mantenerlo en forma de botón Atrás estándar.

Ponga esto en usted viewDidLoad , espero que resulte en lo que está buscando

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

si desea establecer el título en el controlador LLEGADA (a veces más lógica ...) en 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
        }
    })

}

en el próximo controlador:

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

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

¡Sé que esta es una vieja pregunta y las respuestas están un poco actualizadas!

La manera fácil es hacer esto en ViewController principal:

es decir, el que te lleva al siguiente controlador de vista.

self.navigationItem.backBarButtonItem  = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)

Al hacer esto en código, elimine el estilo del botón de retroceso del UINavigationConroller . Si agrega un elemento de navegación en cada una de sus vistas, puede establecer el título del botón trasero en el StoryBoard .

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