Cómo configurar el texto del botón de retroceso en Swift

207

¿Cómo se elimina el texto del botón de retroceso?

Botón de retroceso actual:

<Volver

Botón de retroceso deseado:

<Cualquier otra cosa

Ninguno de estos ha funcionado:

self.navigationItem.backBarButtonItem?.title = "Back"
self.backItem?.title = ""
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationItem.backBarButtonItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title="Back"
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title
Onichan
fuente

Respuestas:

604

El botón Atrás pertenece al controlador de vista anterior , no el que se presenta actualmente en la pantalla.
Para modificar el botón de retroceso, debe actualizarlo antes de presionar, en el controlador de vista que inició el seguimiento:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let backItem = UIBarButtonItem()
    backItem.title = "Something Else"
    navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
}

Swift 3, 4 y 5:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let backItem = UIBarButtonItem()
    backItem.title = "Something Else"
    navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
}

O

// in your viewDidLoad or viewWillAppear
navigationItem.backBarButtonItem = UIBarButtonItem(
    title: "Something Else", style: .plain, target: nil, action: nil)
Yariv Nissim
fuente
9
Muchas gracias, no sabes cuántas horas paso solo por ese pequeño detalle (el controlador anterior)
Ricardo
3
Si pudiera votar un millón de veces, lo haría. No puedo decir cuánto tiempo pasé preguntándome por qué no estaba funcionando (anteriormente estaba en el controlador de destino)
Dylan Irlanda
13
"El botón de retroceso pertenece al controlador de vista anterior" ¡esa es la respuesta más valiosa que he encontrado sobre este tema! ¡Gracias!
vhristoskov
1
Configurar los titlecambios del título , no solo el botón de retroceso.
Yariv Nissim
44
Agregué self.navigationController! .NavigationBar.topItem! .BackBarButtonItem = backItem en lugar de navigationItem.backBarButtonItem = backItem y funciona bien en Swift 3. Gracias
Indra Adam
125

Puede hacerlo desde el generador de interfaces de la siguiente manera:

haga clic en el elemento de navegación del controlador de vista anterior

ingrese la descripción de la imagen aquí

desde el inspector de atributos, configure el texto del botón Atrás para lo que desee. ¡¡Eso es!!

ingrese la descripción de la imagen aquí

Ajinkya Patil
fuente
1
¿Cuál es la mejor manera de asignar 'nulo'?
kennydust
@kennydust ¿Te refieres al título en blanco?
Ajinkya Patil
8
@kennydust sí, en el botón Atrás, agregue espacio y presione Intro
Ajinkya Patil el
Agradable y fácil, pero ¿es localizable?
Gruntcakes
2
@AjinkyaPatil Intenté esto pero el botón Atrás no aparece. ¿Alguna razón por la que esto puede ser?
user805981
48

El texto del botón de retroceso se toma del título del elemento de navegación del controlador de vista principal. Entonces, lo que establezca en el título del elemento de navegación del controlador de vista anterior, se mostrará en el texto del botón de retroceso del controlador de vista actual. Simplemente puede poner "" como título del elemento de navegación en el método viewWillAppear del controlador de vista principal.

self.navigationItem.title = ""

Otra forma es poner

self.navigationController?.navigationBar.topItem?.title = ""

en el método actual viewWillAppear del controlador de vista. Este causará algún otro problema si la pila de navegación está demasiado anidada.

minhazur
fuente
55
self.navigationItem.title = "" debería estar en la parte superior como la mejor respuesta!
rilar
Estoy de acuerdo con esto como la mejor respuesta porque todas las respuestas anteriores requieren agregar una función de destino al elemento de navegación, por lo que no solo cambian el texto, sino que también agregan una función pop personalizada, ¡lo cual no es requerido por la pregunta!
IsPha
Esto funciona bien en prepareForSegue, que es. un poco más limpio porque no estás alterando el nuevo viewController después de que se carga.
Adrian
¡¡¡Presta atención!!! ponga self.title = "....." antes de la llamada a self.navigationItem.title = ""
Bary Levy
45

Puede poner esta línea de código 3 en elViewController que desea cambiar el título del botón Atrás.

En su override func viewDidLoad() {}.

let backButton = UIBarButtonItem()
backButton.title = "My Back Button Title"
self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
Hitesh Chauhan
fuente
2
Esta solución parece más correcta, ya que coloca la lógica en el VC que llega, no en el VC que está dejando. Aka: lee mejor.
eonista
37

Si está utilizando el archivo xib para el controlador de vista, hágalo en su clase de controlador de vista.

class AboutUsViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    edgesForExtendedLayout = []
    setUpNavBar()
}

func setUpNavBar(){
    //For title in navigation bar
    self.navigationController?.view.backgroundColor = UIColor.white
    self.navigationController?.view.tintColor = UIColor.orange
    self.navigationItem.title = "About Us"

    //For back button in navigation bar
    let backButton = UIBarButtonItem()
    backButton.title = "Back"
    self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
}

}

El resultado será:

ingrese la descripción de la imagen aquí

mustaq
fuente
29

No sé dónde usó los métodos que puso en su pregunta, pero podría obtener el resultado deseado si uso, en mi ViewControllerclase (en la que quiero cambiar el botón Atrás), en viewDidLoad()función, la siguiente línea:

self.navigationController?.navigationBar.backItem?.title = "Anything Else"

El resultado será:

antes de

ingrese la descripción de la imagen aquí

Después

ingrese la descripción de la imagen aquí

Francisco Romero
fuente
3
En mi caso, solo funcionó si coloca este código en el método viewDidAppear y no en viewDidLoad one
apinho
2
Úselo en su navigationController.navigationBar.topItem?.title = ""lugar para evitar poner estoviewDidAppear
José
Esta parece la forma más satisfactoria y evita un destello ya que el título del botón de retroceso se cambia a "" usando self.navigationItem.title = "" en el controlador de llamada (dispositivos más lentos). También la otra situación en la que self.navigationItem.title = "" se ignora por completo de forma intermitente y pasa rápidamente al controlador de vista mediante un interruptor de pestaña del controlador de pestañas programáticamente.
FlimFlam Vir
22

El botón Atrás pertenece al controlador de vista anterior, no el que se presenta actualmente en la pantalla. Para modificar el botón Atrás, debe actualizarlo antes de presionar, agregue viewdidload:

Swift 4:

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)
Mohammad Razipour
fuente
12

Simplemente puede modificar el elemento de navegación en el guión gráfico

ingrese la descripción de la imagen aquí

En el botón Atrás, agregue un espacio y presione Entrar.

Nota: Haga esto en el VC anterior.

xhinoda
fuente
8

Swift 4 : configure el botón Atrás antes de presionar cualquier controlador de vista

// if you want to remove the text
navigationItem.backBarButtonItem = UIBarButtonItem()

// if you want to modify the text to "back"
navigationItem.backBarButtonItem = UIBarButtonItem(title: "back", style: .plain, target: nil, action: nil)
budidino
fuente
8

Esto debería funcionar:

override func viewDidLoad() {
    super.viewDidLoad()

    var button = UIBarButtonItem(title: "YourTitle", style: UIBarButtonItemStyle.Bordered, target: self, action: "goBack")
    self.navigationItem.backBarButtonItem = button

}

func goBack()
{
    self.navigationController?.popViewControllerAnimated(true)
}

Aunque no se recomienda, ya que esto realmente reemplaza el botón BackButton y también elimina la flecha hacia atrás y el gesto de deslizar.

Dejan Skledar
fuente
10
no es la forma correcta de hacerlo, solo está reemplazando el botón de retroceso
Yariv Nissim
Es mejor hacerlo desde el generador de interfaces
Rutger Huijsmans
7

Swift 4.2

Si desea cambiar el texto del elemento del botón de retroceso de la barra de navegación, colóquelo en viewDidLoadel controlador ANTES de donde se muestra el botón de retroceso, NO en el controlador de vista donde está visible el botón de retroceso.

 let backButton = UIBarButtonItem()
 backButton.title = "New Back Button Text"
 self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton

Si desea cambiar el texto del título de la barra de navegación actual, use el código a continuación (tenga en cuenta que este se convierte en el texto posterior predeterminado para la vista SIGUIENTE introducida en el controlador de navegación, pero el código anterior puede anular este texto posterior predeterminado)

 self.title = "Navigation Bar Title"
ikbal
fuente
6

Hay dos maneras.

1.En el anterior ViewController.viewDidLoad ()

let backBarBtnItem = UIBarButtonItem()
backBarBtnItem.title = "back"
navigationItem.backBarButtonItem = backBarBtnItem

2.En el currentViewController.viewDidAppear ()

let backBarBtnItem = UIBarButtonItem()
backBarBtnItem.title = "back"      
navigationController?.navigationBar.backItem?.backBarButtonItem = backBarBtnItem

Razón: backButtonproviene de navigationBar.backItem.backBarButtonItem, por lo que la primera forma es obvia. En currentViewController.viewDidLoad (), no podemos obtener la referencia de backItem, porque en viewDidAppear (), navigationBarpresionamos navigationViewsu stack.so podemos hacer cambios en backItemin currentViewController. viewDidAppear ()

Para más detalles, puede ver Documento: UINavigationBar

Calcifer
fuente
3

En el viewDidLoadmétodo del controlador presentador, agregue:

// hide navigation bar title in the next controller
let backButton = UIBarButtonItem(title: "", style:.Plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backButton
Claus
fuente
2

aunque estas respuestas solucionan el problema, pero esto podría ser útil

class MainNavigatioController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        // first
        let backItem = UIBarButtonItem()
        backItem.title = "رجوع"
        self.viewControllers.last?.navigationItem.backBarButtonItem = backItem
        // then
        super.pushViewController(viewController, animated: animated)

    }

}
Ahmad Labeeb
fuente
2

Swift 4

Si bien el dicho anterior para prepararse para la segue es correcto y es cierto, el botón de retroceso pertenece al VC anterior, solo agrega un montón de código innecesario.

Lo mejor que puede hacer es establecer el título del VC actual en viewDidLoad y establecerá automáticamente el título del botón Atrás correctamente en el próximo VC. Esta linea funciono para mi

navigationController?.navigationBar.topItem?.title = "Title"
Joel
fuente
2

Esto funciona para Swift 5 :

self.navigationItem.backBarButtonItem?.title = ""

Tenga en cuenta que será efectivo para el siguiente controlador de vista presionado, no el actual en la pantalla, ¡por eso es muy confuso!

Además, verifique el guión gráfico y seleccione el elemento de navegación del controlador de vista anterior , luego escriba algo en el Botón Atrás (Inspector).

Saeed Ir
fuente
1

Prueba esto ... funcionará ...

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    self.title = ""
}

El código anterior ocultará el texto y mostrará solo la flecha hacia atrás en la barra de navegación.

Sarabjit Singh
fuente
0

Establecer self.title = "" antes self.navigationController?.pushViewController(vc, animated: true).

米米米
fuente
0
override func viewWillAppear(_ animated: Bool) {

    self.tabBarController?.navigationItem.title = "Notes"

    let sendButton = UIBarButtonItem(title: "New", style: .plain, target: self, action: #selector(goToNoteEditorViewController))

    self.tabBarController?.navigationItem.rightBarButtonItem = sendButton
}

func goToNoteEditorViewController(){
   // action what you want
}

¡¡Espero eso ayude!! #swift 3

Sathish Kumar Gurunathan
fuente
0

Si está presionando un controlador de vista desde la página del controlador de vista de página, no puede actualizar el título del botón de retroceso del controlador de navegación. Para resolver esto, cree un delegado nuevamente en su controlador de vista principal (también puede recorrer la jerarquía del controlador de vista hasta el padre).

Además, los botones Atrás tienen un límite de caracteres. Si excede ese límite de caracteres, el sistema pasará por defecto a "Atrás". No se truncará por ti. Por ejemplo:

backItem.title = "Birthdays/Anniversaries" // Get's converted to "Back".
backItem.title = "Birthdays/Anniversa…" // Fits and shows as is.
Justin Domnitz
fuente
0

Swift 4

En mi caso, la solución fue borrar el elemento de navegación del Master View Controller antes de pasar al Child View Controller. Y configúrelo nuevamente si se muestra nuevamente

MasterController

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationItem.title = "Master Title"
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationItem.title = ""
}

Y así es como presiono un UIViewController y borro el elemento del botón de la barra posterior en el controlador secundario:

MasterController

let childController = ChildController(collectionViewLayout: UICollectionViewFlowLayout())
childController.navigationItem.backBarButtonItem?.title = ""
navigationController?.pushViewController(childController, animated: true)
Jorge Casariego
fuente
0

para Swift 4.2

let backItem = UIBarButtonItem()
backItem.title = ""
navigationItem.backBarButtonItem = backItem
Iryna Batvina
fuente
0

GOTCHA: Si tiene problemas con alguna de las sugerencias con muchas estrellas, asegúrese de registrar sus UITableViewCellcorreos electrónicos viewDidLoad(), no deinit()

Womble
fuente
-1

Solución comprobada y funciona en Swift 5

A continuación pongo algunas soluciones para diferentes casos:

1. Eliminar texto del botón Atrás

La mejor solución para eliminar texto del botón Atrás es agregar viewDidLoad ():

navigationItem.backBarButtonItem = UIBarButtonItem()

2. Establecer texto propio en el botón Atrás

En caso de que desee configurar su propio título, hágalo configurando el título de backButton:

let backButton = UIBarButtonItem()
backButton.title = "My Title"
navigationItem.backBarButtonItem = backItem

3. Botón de retroceso vacío en todos los VC

Si desea crear un estilo común en toda la aplicación: para tener una flecha hacia atrás sin texto, cree un VC base para todos sus Controladores de vista:

class BaseViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.backBarButtonItem = UIBarButtonItem()
    }
}

La solución presentada anteriormente le permite personalizar el botón de retroceso en el futuro si desea hacer alguna excepción más adelante, agregando una variable adicional y anulándola en ViewController específico, f.ex:

class BaseViewController: UIViewController {

    var customBackButtonTitle: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        var backButton = UIBarButtonItem()
        if let text = customBackButtonTitle {
            backButton.title = text
        }
        navigationItem.backBarButtonItem = backButton
    }
}
lukszar
fuente
-2

rápido 4

Hay una forma de cambiar el texto en backButton mediante programación desde viewController actual:

navigationController?.navigationBar.items![0].title = "some new text"
zslavman
fuente