Comment restaurer le texte du bouton dans Swift

207

Comment supprimer le texte du bouton de retour.

Bouton de retour actuel:

<Retour

Bouton de retour souhaité:

<AnythingElse

Aucun de ceux-ci n'a fonctionné:

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
la source

Réponses:

604

Le bouton de retour appartient au contrôleur de vue précédent , pas celui actuellement présenté à l'écran.
Pour modifier le bouton de retour, vous devez le mettre à jour avant de pousser, sur le contrôleur de vue qui a initié la séquence:

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

OU

// in your viewDidLoad or viewWillAppear
navigationItem.backBarButtonItem = UIBarButtonItem(
    title: "Something Else", style: .plain, target: nil, action: nil)
Yariv Nissim
la source
9
Merci beaucoup, vous ne savez pas combien d'heures je passe juste pour ce petit détail (le contrôleur précédent)
Ricardo
3
Si je pouvais voter un million de fois, je le ferais. Je ne peux pas vous dire combien de temps j'ai passé à me demander pourquoi cela ne fonctionnait pas (était auparavant sur le contrôleur de destination)
Dylan Ireland
13
"Le bouton de retour appartient au contrôleur de vue précédent" c'est la réponse la plus valable que j'ai trouvée à ce sujet! Je vous remercie!
vhristoskov
1
Définir les titlemodifications du titre , pas seulement le bouton de retour.
Yariv Nissim
4
J'ai ajouté self.navigationController! .NavigationBar.topItem! .BackBarButtonItem = backItem au lieu de navigationItem.backBarButtonItem = backItem et cela fonctionne très bien sur Swift 3. Merci
Indra Adam
125

Vous pouvez le faire à partir du générateur d'interface comme suit:

cliquez sur l'élément de navigation du contrôleur de vue précédent

entrez la description de l'image ici

à partir de l'inspecteur d'attributs, définissez le texte du bouton de retour sur ce que vous voulez. C'est tout!!

entrez la description de l'image ici

Ajinkya Patil
la source
1
quelle est la meilleure façon d'attribuer «néant»?
kennydust
@kennydust Voulez-vous dire un titre vide?
Ajinkya Patil
8
@kennydust yes dans le bouton de retour ajoutez de l'espace et appuyez sur Entrée
Ajinkya Patil
Agréable et facile, mais est-il localisable?
Gruntcakes
2
@AjinkyaPatil J'ai essayé cela mais le bouton Retour n'apparaît pas. Une raison pour laquelle cela peut être?
user805981
48

Le texte du bouton Retour est tiré du titre de l'élément de navigation du contrôleur de vue parent. Ainsi, tout ce que vous définissez sur le titre de l'élément de navigation du contrôleur de vue précédent sera affiché sur le texte du bouton de retour du contrôleur de vue actuel. Vous pouvez simplement mettre "" comme titre d'élément de navigation dans la méthode viewWillAppear du contrôleur de vue parent.

self.navigationItem.title = ""

Une autre façon est de mettre

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

dans la méthode viewWillAppear du contrôleur de vue actuel. Celui-ci causera un autre problème si la pile de navigation est trop imbriquée.

minhazur
la source
5
self.navigationItem.title = "" devrait être en tête de liste comme meilleure réponse!
rilar
Je suis d'accord avec cela comme la meilleure réponse car toutes les réponses ci-dessus nécessitent l'ajout d'une fonction cible à l'élément de navigation, donc ils ne changent pas seulement le texte mais ils ajoutent également une fonction pop personnalisée, ce qui n'est pas requis par la question!
IsPha
Cela fonctionne très bien prepareForSegue, ce qui est. un peu plus propre car vous ne modifiez pas le nouveau viewController après son chargement.
Adrian
Faites attention!!! mettez self.title = "....." avant l'appel à self.navigationItem.title = ""
Bary Levy
45

Vous pouvez mettre ces 3 lignes de code dans le titre queViewController vous souhaitez modifier le bouton de retour.

Dans votre override func viewDidLoad() {}.

let backButton = UIBarButtonItem()
backButton.title = "My Back Button Title"
self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
Hitesh Chauhan
la source
2
Cette solution semble plus correcte, car vous mettez la logique dans le VC arrivant et non dans le VC que vous quittez. Aka: lit mieux.
eonist
37

Si vous utilisez le fichier xib pour le contrôleur de vue, faites-le dans votre classe de contrôleur de vue.

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
}

}

Le résultat sera:

entrez la description de l'image ici

mustaq
la source
29

Je ne sais pas où vous avez utilisé vos méthodes que vous posez sur votre question mais je pourrais obtenir le résultat souhaité si j'utilise, sur ma ViewControllerclasse (dans laquelle je veux changer le bouton retour), sur la viewDidLoad()fonction, la ligne suivante:

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

Le résultat sera:

Avant

entrez la description de l'image ici

Après

entrez la description de l'image ici

Francisco Romero
la source
3
Dans mon cas, cela n'a fonctionné que si vous placez ce morceau de code sur la méthode viewDidAppear et non sur celle de viewDidLoad
apinho
2
Utilisez navigationController.navigationBar.topItem?.title = ""plutôt pour éviter de mettre celaviewDidAppear
José
Cela semble la manière la plus satisfaisante et évite un flash car le titre du bouton de retour est changé en "" en utilisant self.navigationItem.title = "" dans le contrôleur appelant (périphériques plus lents). De plus, l'autre situation où self.navigationItem.title = "" est complètement ignoré par transition intermittente rapidement dans le contrôleur de vue via un commutateur d'onglet de contrôleur d'onglet par programmation.
FlimFlam Vir
22

Le bouton de retour appartient au contrôleur de vue précédent, pas celui actuellement présenté à l'écran. Pour modifier le bouton de retour, vous devez le mettre à jour avant de pousser, ajoutez viewdidload:

Swift 4:

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

Vous pouvez simplement modifier le NavigationItem dans le storyboard

entrez la description de l'image ici

Dans le bouton Précédent, ajoutez un espace et appuyez sur Entrée.

Remarque: faites cela dans le VC précédent.

xhinoda
la source
8

Swift 4 - Configurez le bouton de retour avant d'appuyer sur les contrôleurs de vue

// 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
la source
8

Cela devrait fonctionner:

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

Bien qu'il ne soit pas recommandé car cela remplace en fait le backButton et il a également supprimé la flèche arrière et le geste de balayage.

Dejan Skledar
la source
10
pas la bonne façon de le faire, vous remplacez simplement le bouton de retour
Yariv Nissim
Mieux vaut le faire à partir du constructeur d'interface
Rutger Huijsmans
7

Swift 4.2

Si vous souhaitez modifier le texte de l'élément du bouton de retour de la barre de navigation, placez-le dans viewDidLoadle contrôleur AVANT celui où le bouton de retour s'affiche, PAS sur le contrôleur de vue où le bouton de retour est visible.

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

Si vous souhaitez modifier le texte du titre de la barre de navigation actuelle, utilisez le code ci-dessous (notez que cela devient le texte arrière par défaut pour la vue SUIVANTE poussée sur le contrôleur de navigation, mais ce texte arrière par défaut peut être remplacé par le code ci-dessus)

 self.title = "Navigation Bar Title"
ikbal
la source
6

Il y a deux façons.

Dans le précédent ViewController.viewDidLoad ()

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

Dans le CurrentViewController.viewDidAppear ()

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

Raison: le backButtonvient de navigationBar.backItem.backBarButtonItem, donc la première façon est évidente. Dans currentViewController.viewDidLoad (), nous ne pouvons pas obtenir la référence de backItem, car dans viewDidAppear (), le navigationBarpoussé navigationViewsur son stack.so nous pouvons apporter des modifications au backItemdans currentViewController. viewDidAppear ()

Pour plus de détails, vous pouvez voir le document: UINavigationBar

Calcifer
la source
3

Dans la viewDidLoadméthode du contrôleur présentateur, ajoutez:

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

bien que ces réponses résolvent le problème, mais cela pourrait être 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)

    }

}
Ahmad Labeeb
la source
2

Swift 4

Alors que le dicton précédent pour se préparer à la séquence est correct et que son vrai bouton retour appartient au VC précédent, il suffit d'ajouter un tas de code inutile.

La meilleure chose à faire est de définir le titre du VC actuel dans viewDidLoad et cela définira automatiquement le titre du bouton de retour correctement sur le VC suivant. Cette ligne a fonctionné pour moi

navigationController?.navigationBar.topItem?.title = "Title"
Joel
la source
2

Cela fonctionne pour Swift 5 :

self.navigationItem.backBarButtonItem?.title = ""

Veuillez noter qu'il sera efficace pour le prochain contrôleur de vue poussé et non pour le contrôleur actuel, c'est pourquoi c'est très déroutant!

Vérifiez également le storyboard et sélectionnez l'élément de navigation du contrôleur de vue précédent , puis tapez quelque chose dans le bouton Retour (Inspecteur).

Saeed Ir
la source
1

Essayez ceci ... cela fonctionnera ....

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

Le code ci-dessus masquera le texte et affichera uniquement la flèche de retour sur la barre de navigation.

Sarabjit Singh
la source
0

Réglez self.title = "" avant self.navigationController?.pushViewController(vc, animated: true).

米米米
la source
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
}

J'espère que ça aide!! #swift 3

Sathish Kumar Gurunathan
la source
0

Si vous poussez un contrôleur de vue à partir de la page du contrôleur de vue de page, vous ne pouvez pas mettre à jour le titre du bouton de retour du contrôleur de navigation. Pour résoudre ce problème, créez un délégué vers votre contrôleur de vue parent (vous pouvez également être en mesure de parcourir la hiérarchie du contrôleur de vue vers le parent).

De plus, les boutons Retour ont une limite de caractères. Si vous dépassez cette limite de caractères, le système reviendra par défaut à "Retour". Il ne sera pas tronqué pour vous. Par exemple:

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

Swift 4

Dans mon cas, la solution consistait à effacer l'élément de navigation du contrôleur Master View avant de passer au contrôleur Child View. Et définissez-le à nouveau s'il est affiché

MasterController

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

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

Et voici comment je pousse un UIViewController et efface l'élément du bouton de la barre arrière dans le contrôleur enfant:

MasterController

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

pour Swift 4.2

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

GOTCHA: Si vous rencontrez des problèmes avec l'une des suggestions à plusieurs étoiles, assurez-vous que vous enregistrez votre UITableViewCells dans viewDidLoad(), pas deinit()

Womble
la source
-1

Solution vérifiée et fonctionne dans Swift 5

Ci-dessous, je mets quelques solutions pour différents cas:

1. Supprimer le texte du bouton de retour

La meilleure solution pour supprimer le texte du bouton précédent est d'ajouter dans viewDidLoad ():

navigationItem.backBarButtonItem = UIBarButtonItem()

2. Définir son propre texte sur le bouton de retour

Si vous souhaitez définir votre propre titre, faites-le en définissant le titre de backButton:

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

3. Bouton de retour vide sur tous les VC

Si vous souhaitez créer un style commun dans toute l'application - pour avoir juste une flèche en arrière sans texte, créez un VC de base pour tous vos contrôleurs de vue:

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

        navigationItem.backBarButtonItem = UIBarButtonItem()
    }
}

La solution présentée ci-dessus vous permet de personnaliser le bouton de retour à l'avenir si vous souhaitez faire une exception plus tard, en ajoutant une variable supplémentaire et en la remplaçant dans ViewController spécifique, 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
la source
-2

rapide 4

il existe un moyen de modifier le texte dans backButton par programme à partir de la vue actuelleController:

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