El «botón de atrás» de un UINavigationController se muestra por defecto el título de la última vista en la pila. Es allí una manera de tener un texto personalizado en el botón atrás en su lugar?

  • Este trabajo para mí self.navigationController.navigationBar.topItem.title = @"Custom text";
InformationsquelleAutor Ali Shafai | 2009-09-17

16 Comentarios

  1. 340

    De en este enlace:

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

    Como dijo Tyler en los comentarios:

    no hacer esto en la parte visible del controlador de vista, pero en la vista
    controlador que te gustaría ver si pulsa el botón atrás

    • Usted debe release la UIBarButtonItem.
    • También tenga en cuenta, usted necesita para hacer esto en el controlador de vista de un nivel hacia arriba en la pila. En otras palabras, no hagas esto en la parte visible del controlador de vista, pero en el controlador de vista que te gustaría ver si pulsa el botón atrás.
    • Muchas gracias Tyler. Tu comentario me salvó un montón de tiempo!
    • Solo para aclarar Tyler comentario porque yo no entiendo de esto en primer lugar: la Configuración de la backBarButtonItem en una vista de los controladores de navigationItem es la configuración de los botones que se muestran a conseguir de nuevo a este punto de vista controlador. También tenga en cuenta que aunque no hay ningún botón de estilo para el botón de la flecha en este botón, se obtiene el estilo de flecha de todos modos. He utilizado UIBarButtonItemStylePlain y aún así obtener el botón de la flecha estilo.
    • Con respecto a Tyler comentario…
    • Otra ay que me encontré, si es que puede ayudar a cualquier persona: Usted necesita ver todos los controladores en la pila para implementar algún título o elemento de navegación. De lo contrario, hay agujeros en la navegación elemento de la lista y comienza a echar a perder…
    • Traté de establecer el título de este artículo, sin inicializarla – no de trabajo. Esto funciona y personalizado aspecto también funciona aunque init con estilo Areoladas.
    • No funciona. Me juego que a Posterior nos muestra el título de la anterior viewController.
    • Sugerencia: en Lugar de asumir el estilo, pase al conjunto actual de estilo. En esta respuesta el código, reemplace UIBarButtonItemStyleBordered con una llamada a la propiedad self.navigationItem.backBarButtonItem.style. Documentación: developer.apple.com/library/ios/documentation/uikit/reference/…
    • Tenga en cuenta que bajo el ARCO que usted debe dejar fuera el grupo de liberación automática de llamadas. así que usted tiene auto.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@Personalizado»Título» de estilo:UIBarButtonItemStyleBordered objetivo:nil acción:nil];
    • Código Swift: self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Bordered, target: nil, action: nil)
    • También tenga en cuenta esto: «Si el título de tu botón de atrás es demasiado largo para caber en el espacio disponible en la barra de navegación la barra de navegación puede sustituir a la cadena de «Volver» en lugar de la original del botón de título.» a partir De la documentación
    • Lo que sobre de color personalizado?
    • Gracias Zaheer para el Swift versión. Tengo una advertencia acerca de «UIBarButtonItemStyle.Limita» va a quedar en desuso, así que me reemplazó con «UIBarButtonItemStyle.Plain»
    • Puede esta misma técnica se utiliza para anular la acción del botón «atrás»? Por ejemplo, si quería llamar popToRootViewControllerAnimated en lugar de simplemente ir por un ViewController?
    • UIBarButtonItemStyleBordered ha sido desaprobado en iOS 8.0. Uso UIBarButtonItemStylePlain en iOS 7.0 y versiones posteriores.
    • Esto funciona muy bien, pero no tiene ningún sentido lógico a todos. Por qué iba yo a querer agregar un botón atrás para AUTO (el anterior controlador), en contraposición a viewDidLoad caso de la pantalla que necesita el botón….

  2. 43

    Puede establecer el texto en la Interfaz de Generador:

    Seleccione el elemento de navegación de la ViewController que el botón atrás volvería a:

    UINavigationController

    En las utilidades del panel de atributo inspector, introduzca su etiqueta para el Botón Atrás:

    UINavigationController

    Yo prefiero este enfoque con respecto a la configuración del título en el código como en la aceptación de la respuesta.

    También tenga en cuenta, usted necesita para hacer esto en el controlador de vista de un nivel de seguridad de la
    de la pila. En otras palabras, no hagas esto en la parte visible del controlador de vista,
    pero en el controlador de vista que te gustaría ver si pulsa el botón atrás.

    –Tyler

    • Esta es la mejor respuesta que he encontrado hasta ahora.
    • Para ser claros, este debe ser configurado en el controlador de vista del Elemento de Navegación, no en el controlador de vista de los atributos del inspector de sí mismo.
    • Esta es la mejor respuesta que he encontrado.
    • Esta es la mejor respuesta
    • Como de Xcode 6.1.1, y que se ejecuta en iOS 7, parece que su original visión anterior título TODAVÍA anular la vuelta del botón de título se establece aquí. Si el anterior título de la vista contiene más que el límite de 11 caracteres, a continuación, la siguiente vista posterior del botón de simplemente decir «Atrás». No hay manera alrededor de ella, excepto para crear una nueva barra de navegación del elemento a partir de cero, como se muestra en la parte superior de votación respuesta aquí.
    • Esto debería ser mucho más alto en este hilo. Trabajó como un encanto y mantiene el código limpio

  3. 22

    Yo uso 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";
    }
    • Este casi me funciona, pero cuando hago clic en el botón atrás, el texto de los cambios en el título de los padres durante la duración de la animación 🙁
    • Esto cambia el botón Atrás el título de la controladora en la pila. No cambia el botón Atrás el título de la muestra actualmente controlador. Peor aún: se cambia el título de la controladora de la anterior a la anterior controlador!
    • Como se señaló por otros comentaristas, este método es un poco insostenible. Yo no recomendaría hacer esto, ya que no es la realidad de la API tiene la intención de usarla. Usted podría ser el establecimiento de sí mismo para el difícil errores en el futuro!
    • no funciona en mi caso
  4. 11

    He encontrado una solución práctica a esta poniendo simplemente el título del controlador antes de empujar a otro controlador en la pila, como este:

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

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

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

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

    • El problema con esto es que el título cambia en el viejo ver como se anima y se ve un poco naff. Ninguna de las soluciones que aquí parecen funcionar como quieras 🙁
    • Esto es perfecto en mi situación, porque yo no mostrar la barra de navegación en la pantalla anterior y solo quiero quitar el titleLabel desde el botón «atrás» en la nueva pantalla, y tengo el iOS7 chevron flecha. Por tanto, puedo acaba de establecer un vacío NSString literal para el título.
    • empujando controlador de vista de elevar la excepción cuando se pulse sobre el botón atrás
  5. 7

    El título de la parte posterior botón de valores predeterminados para el anterior título de la vista para una rápida truco que uso es colocar el siguiente código en la vista anterior del .m archivo.

    -(void)viewWillAppear:(BOOL)animated {
    
        //Set title
        self.navigationItem.title[email protected]"Original Title";
    }
    
    -(void)viewWillDisappear:(BOOL)animated {
    
        //Set title
        self.navigationItem.title[email protected]"Back";
    }
    • Esto funciona muy bien para la mayoría de los casos, y es bastante simple… sólo observación es que reemplazar cualquiera de estos métodos requiere que el super de la implementación de ser llamado en algún punto en el nuevo método.
    • Con este método, se nota el título de la vista principal de ser cambiado a «Atrás» antes de que el empuje de animación que sucede. (Y, sorta una mierda, que si usted se mueve de este a la viewDidDisappear método, verás el interruptor ocurriendo después de la inserción..)
    • Me encanta este método, pero el problema al que me enfrento con esto es que el «Título Original» se pone bien pero viene con un botón de puntos suspensivos si es más larga que la de «Volver», que debe de ser porque, desde el punto de vista aún no está en la vista de jerarquía, no relayout el título de la vista. El problema descrito por @JamesBoutcher de arriba es imperceptible para mí, debido a la rápida velocidad inicial de la animación. De hecho, me acabo de dar cuenta que el problema al que me enfrento es especialmente notable debido a la lentitud de final de la animación, que es cuando este problema es prominente.
    • Mientras que la respuesta en stackoverflow.com/questions/1441699/… se siente como una mayor personalización de la necesaria, es la documentada y lo que es más importante parece ser más acorde con nuestra intención.
  6. 6

    en su método init, agregue el código siguiente:

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

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

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

    Agregue el código siguiente en viewDidLoad o loadView

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

    He probado en iPhone y iPad con iOS 9

    • Debe ser automática.navigationController?.navigationBar.backItem?.title = «Texto Personalizado»
    • única diferencia que yo necesitaba era el opcional de encadenamiento en la navigationController y topItem propiedades, como por ejemplo: self.navigationController?.navigationBar.topItem?.title = "Custom Text"
  8. 2

    La adición de frenar la respuesta. Nota de Apple docs que la declaración de backBarButtonItem es este:

    @property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

    Por lo tanto, frenar la respuesta de pérdida de memoria debido a la sintetizado setter se retain la instancia de pasar, que nunca se libera de forma explícita. Puede solucionar este problema mediante el uso de 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 de modo que usted puede liberar explícitamente más adelante:

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

    Espero que esto ayude!

    • Nota: en estos días, con ARCO, usted no necesita preocuparse por el grupo de liberación automática (y, de hecho, el compilador dará un error si intenta grupo de liberación automática en un ARCO habilitado proyecto)
  9. 2
    - (void)viewDidLoad {
      [super viewDidLoad];
    
      UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
      self.navigationItem.backBarButtonItem = backButton;
      [backButton release];
    }
  10. 2

    He descubierto algo interesante.
    Si usted subclase de la UINavigationController y anular el pushViewController:animated: método y hacer algo como esto: (tened 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];

    A continuación, para todos los ViewControllers que se insertan con su navegación controlador tendrá el botón «Atrás» en forma automática. Si desea cambiar el texto para ciertos vista de los controladores puede probar y tal vez fundido el viewcontroller a una determinada clase o de su propio protocolo personalizado (que a su viewcontroller hereda de que podría haber un método como backButtonText o algo tonto como que) que puede dar cierta información sobre el viewcontroller que viene en sothat puede personalizar el botón atrás de texto para ello. Ahora el botón atrás de texto en un lugar que debería ocupar la única responsabilidad. Tengo que admitir que la creación de un nuevo botón para cambiar el texto de mierda, pero bueno.

    ¿Alguien puede pensar en una razón por qué no hacerlo de esta manera? Al menos no tienes que trastear con el viewcontroller títulos o tiene que recordar para crear un nuevo botón atrás antes de empujar el viewcontroller en la navegación de la controladora.

  11. 0

    rein respuesta funciona bien.

    Tenga en cuenta que si se pulsa más de un controlador de vista, el cambió de nuevo el botón de título aparecerá para cada uno de ellos, que puede no ser lo que usted quiere.

    En ese caso, usted necesita para crear el custom UIBarButtonItem cada vez que se pulse un controlador de vista.

    También, asegúrese de hacerlo antes de empujando el controlador de vista, de lo contrario aparecerá una pantalla de hipo como los cambios de título.

  12. 0

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

    crear dos variables para almacenar los valores antiguos de los padres navigationItem.el título y el padre del navigationItem

    UINavigationItem* oldItem;
    NSString* oldTitle;

    en viewDidLoad, agregue el siguiente:

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

    en viewWillDisappear, agregue el 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. Usted verá el título de la vista principal cambio como el nuevo controlador es animadas. PERO esto no lograr el objetivo de personalizado etiquetado el botón atrás y mantener la forma de un estándar botón atrás.

  13. 0

    Poner esto en usted viewDidLoad, espero que de resultado en lo que usted está buscando

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

    si desea establecer el título en LLEGAR controlador (a veces más lógica..)
    en swift 3:

    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 las próximas controlador:

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

    generalmente pongo yo.setBackButtonNavBar en un controlador de extensión.

  15. 0

    Sé que esto es una vieja pregunta y las respuestas de tipo actualizadas!

    De la manera más fácil es hacerlo en el padre ViewController:

    yo.e el que te lleva a la siguiente controlador de vista.

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

    Haciendo esto en el código quitar el botón atrás de estilo de la UINavigationConroller. Si agrega un Elemento de Navegación en cada uno de los suyos puntos de vista, se puede establecer el título de la vuelta botton en el StoryBoard.

Dejar respuesta

Please enter your comment!
Please enter your name here