Come ripristinare il testo del pulsante in Swift


207

Come si rimuove il testo del pulsante Indietro.

Pulsante indietro corrente:

<Indietro

Pulsante indietro desiderato:

<AnythingElse

Nessuno di questi ha funzionato:

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

Risposte:


604

Il pulsante Indietro appartiene al controller della vista precedente , non a quello attualmente visualizzato sullo schermo.
Per modificare il pulsante Indietro è necessario aggiornarlo prima di premere, sul controller di visualizzazione che ha avviato il seguente:

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

9
Grazie mille, non sai quante ore trascorro solo per quel piccolo dettaglio (il controller precedente)
Ricardo

3
Se potessi votare un milione di volte lo farei. Non posso dirti quanto tempo ho trascorso chiedendomi perché non funzionasse (era precedentemente sul controller di destinazione)
Dylan Irlanda

13
"Il pulsante Indietro appartiene al controller della vista precedente" è la risposta più preziosa che ho trovato su questo argomento! Grazie!
Vhristoskov,

1
L'impostazione delle titlemodifiche sul titolo , non solo sul pulsante Indietro.
Yariv Nissim,

4
Ho aggiunto self.navigationController! .NavigationBar.topItem! .BackBarButtonItem = backItem invece di navigationItem.backBarButtonItem = backItem e funziona benissimo su Swift 3. Grazie
Indra Adam,

125

Puoi farlo dal generatore di interfacce come segue:

fai clic sulla voce di navigazione del controller della vista precedente

inserisci qui la descrizione dell'immagine

dalla finestra di ispezione degli attributi imposta il testo del pulsante Indietro su quello che desideri. Questo è tutto!!

inserisci qui la descrizione dell'immagine


1
qual è il modo migliore per assegnare "zero"?
kennydust,

@kennydust Intendi il titolo vuoto?
Ajinkya Patil,

8
@kennydust Sì nel pulsante Indietro aggiungi spazio e premi Invio
Ajinkya Patil

Bello e facile, ma è localizzabile?
Gruntcakes,

2
@AjinkyaPatil Ho provato questo, ma il pulsante Indietro non viene visualizzato. Qualche motivo per cui questo potrebbe essere?
user805981

48

Il testo del pulsante Indietro è tratto dal titolo dell'elemento di navigazione del controller della vista padre. Quindi, qualunque cosa tu abbia impostato sul titolo dell'elemento di navigazione del controller di vista precedente, verrà mostrato sul testo del pulsante Indietro del controller di vista corrente. Puoi semplicemente inserire "" come titolo dell'elemento di navigazione nel metodo viewWillAppear del controller della vista padre.

self.navigationItem.title = ""

Un altro modo è quello di mettere

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

nella vista corrente il metodo viewWillAppear del controller. Questo causerà qualche altro problema se lo stack di navigazione è troppo nidificato.


5
self.navigationItem.title = "" dovrebbe essere in cima come la migliore risposta!
rilar,

Sono d'accordo con questa come la migliore risposta perché tutte le risposte sopra richiedono l'aggiunta di una funzione target all'elemento di navigazione, quindi non cambiano solo il testo ma aggiungono anche una funzione pop personalizzata, che non è richiesta dalla domanda!
Ispa

Questo funziona bene prepareForSegue, che è. un po 'più pulito perché non stai modificando il nuovo viewController dopo il caricamento.
Adrian

Fai attenzione!!! put self.title = "....." prima della chiamata a self.navigationItem.title = ""
Bary Levy,

45

È possibile inserire questa 3 riga di codice in cuiViewController si desidera modificare il titolo del pulsante Indietro.

Nel tuo override func viewDidLoad() {}.

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

2
Questa soluzione sembra più corretta, poiché metti la logica nel VC in arrivo non nel VC che stai lasciando. Alias: legge meglio.
eonista,

37

Se si utilizza il file xib per il controller della vista, farlo nella classe del controller della 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
}

}

Il risultato sarà:

inserisci qui la descrizione dell'immagine


29

Non so dove hai usato i tuoi metodi che hai posto sulla tua domanda ma potrei ottenere il risultato desiderato se uso, sulla mia ViewControllerclasse (in cui voglio cambiare il pulsante Indietro), sulla viewDidLoad()funzione, la seguente riga:

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

Il risultato sarà:

Prima

inserisci qui la descrizione dell'immagine

Dopo

inserisci qui la descrizione dell'immagine


3
Nel mio caso ha funzionato solo se hai inserito questo pezzo di codice sul metodo viewDidAppear e non su viewDidLoad one
apinho,

2
Usa navigationController.navigationBar.topItem?.title = ""invece per evitare di inserire questoviewDidAppear
José

Questo sembra il modo più soddisfacente ed evita un lampo poiché il titolo del pulsante Indietro viene cambiato in "" usando self.navigationItem.title = "" nel controller di chiamata (dispositivi più lenti). Anche l'altra situazione in cui self.navigationItem.title = "" viene completamente ignorato passando in modo intermittente rapidamente nel controller di visualizzazione tramite un interruttore di scheda del controller di scheda programmaticamente.
FlimFlam Vir

22

Il pulsante Indietro appartiene al controller della vista precedente, non a quello attualmente visualizzato sullo schermo. Per modificare il pulsante Indietro è necessario aggiornarlo prima di premere, aggiungere viewdidload:

Swift 4:

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

12

Puoi semplicemente modificare NavigationItem nello storyboard

inserisci qui la descrizione dell'immagine

Nel pulsante Indietro aggiungi uno spazio e premi Invio.

Nota: eseguire questa operazione nel VC precedente.


8

Swift 4 : configura il pulsante Indietro prima di premere qualsiasi controller di visualizzazione

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

8

Questo dovrebbe funzionare:

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

Sebbene non sia raccomandato poiché in realtà sostituisce il pulsante Indietro e rimuove anche la freccia indietro e il gesto di scorrimento.


10
non è il modo giusto per farlo, stai solo sostituendo il pulsante Indietro
Yariv Nissim

Meglio farlo dal costruttore di interfacce
Rutger Huijsmans,

7

Rapido 4.2

Se si desidera modificare il testo dell'elemento del pulsante Indietro della barra di navigazione, inserirlo nel viewDidLoadcontroller PRIMA di quello in cui viene visualizzato il pulsante Indietro, NON sul controller di visualizzazione in cui è visibile il pulsante Indietro.

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

Se si desidera modificare il testo del titolo della barra di navigazione corrente, utilizzare il codice riportato di seguito (si noti che questo diventa il testo posteriore predefinito per la vista SUCCESSIVA inserito nel controller di navigazione, ma questo testo posteriore predefinito può essere sovrascritto dal codice sopra)

 self.title = "Navigation Bar Title"

6

Ci sono due modi.

1.Nel precedenteViewController.viewDidLoad ()

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

2.In currentViewController.viewDidAppear ()

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

Motivo: il backButtonviene da navigationBar.backItem.backBarButtonItem, quindi il primo modo è ovvio. In currentViewController.viewDidLoad (), non possiamo ottenere il riferimento di backItem, perché in viewDidAppear (), il navigationBarpush navigationViewsul suo. stackCosì possiamo apportare modifiche a backItemin currentViewController. viewDidAppear ()

Per ulteriori dettagli, è possibile consultare il documento: UINavigationBar


3

Nel viewDidLoadmetodo del controller di presentazione aggiungere:

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

2

sebbene queste risposte risolvano il problema, ma questo potrebbe essere utile

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)

    }

}

2

Swift 4

Mentre il precedente detto per prepararsi a segue è corretto ed è vero il pulsante indietro appartiene al VC precedente, è solo l'aggiunta di un sacco di codice non necessario.

La cosa migliore da fare è impostare il titolo del VC corrente in viewDidLoad e imposterà automaticamente il titolo del pulsante Indietro correttamente sul VC successivo. Questa linea ha funzionato per me

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

2

Questo funziona per Swift 5 :

self.navigationItem.backBarButtonItem?.title = ""

Nota che sarà efficace per il prossimo controller di visualizzazione push non quello corrente sul display, ecco perché è molto confuso!

Inoltre, controlla lo storyboard e seleziona l'elemento di navigazione del controller della vista precedente , quindi digita qualcosa nel pulsante Indietro (Impostazioni).


1

Prova questo ... funzionerà ....

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

Il codice sopra nasconderà il testo e mostrerà solo la freccia indietro sulla barra di navigazione.


0

Imposta self.title = "" prima self.navigationController?.pushViewController(vc, animated: true).


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
}

Spero che sia d'aiuto!! #swift 3


0

Se si sta spingendo un controller di visualizzazione dalla pagina del controller di visualizzazione della pagina, non è possibile aggiornare il titolo del pulsante Indietro del controller di navigazione. Per risolvere questo problema, crea un delegato al controller della vista padre (potresti anche essere in grado di attraversare la gerarchia del controller della vista fino al padre).

Inoltre, i pulsanti Indietro hanno un limite di caratteri. Se si supera quel limite di caratteri, il sistema sarà impostato su "Indietro". Non si troncerà per te. Per esempio:

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

0

Swift 4

Nel mio caso, la soluzione era cancellare l'elemento di navigazione del controller di visualizzazione principale prima di passare al controller di visualizzazione figlio. E impostarlo di nuovo se viene mostrato di nuovo

MasterController

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

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

Ed è così che spingo un UIViewController e deseleziono l'elemento del pulsante della barra posteriore nel controller figlio:

MasterController

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

0

per Swift 4.2

let backItem = UIBarButtonItem()
backItem.title = ""
navigationItem.backBarButtonItem = backItem

0

GOTCHA: Se si hanno problemi con uno qualsiasi dei molti-protagonista suggerimenti, assicurarsi che si sta registrando i vostri UITableViewCells in viewDidLoad(), non è dainit()


-1

Soluzione verificata e funzionante in Swift 5

Di seguito metto alcune soluzioni per diversi casi:

1. Rimuovere il testo dal pulsante Indietro

La migliore soluzione per rimuovere il testo dal pulsante Indietro è aggiungere in viewDidLoad ():

navigationItem.backBarButtonItem = UIBarButtonItem()

2. Impostare il proprio testo sul pulsante Indietro

Nel caso in cui desideri impostare il tuo titolo, fallo impostando il titolo di backButton:

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

3. Svuotare il pulsante Indietro su tutti i VC

Se vuoi creare uno stile comune in tutta l'app - per avere la freccia indietro senza testo, crea un VC di base per tutti i tuoi controller di visualizzazione:

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

        navigationItem.backBarButtonItem = UIBarButtonItem()
    }
}

La soluzione presentata sopra ti consente di personalizzare il pulsante Indietro in futuro se vuoi fare qualche eccezione in seguito, aggiungendo una variabile aggiuntiva e sovrascrivendola in ViewController specifico, 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
    }
}

-2

veloce 4

c'è un modo per cambiare il testo in backButton a livello di codice dalla viewController corrente:

navigationController?.navigationBar.items![0].title = "some new text"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.