Supprimer le texte du bouton Retour en conservant l'icône


93

Je souhaite supprimer le texte du bouton de retour, mais je souhaite conserver l'icône. j'ai essayé

let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton

Cependant, cela supprime complètement le texte et l'icône.

Réponses:


98

La méthode de @ rmd2 est presque correcte, mais à la place, vous devez sélectionner la barre de navigation du contrôleur vers laquelle le bouton de retour pointera et tapez " "dans le champ Bouton de retour.

entrez la description de l'image ici


1
pire façon, si le viewcontroller n'a pas la barre de navigation, je devrai ajouter pour supprimer le texte
Daniel Beltrami

143

Je sais que cela a déjà une réponse, mais vous pouvez également le faire dans le code (au cas où vous travaillez avec des plumes)

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

Ajoutez ce qui précède dans le premier contrôleur de vue.

Notez que vous devez le faire pour chaque contrôleur de vue qui pousse. Donc, si vous avez 3 contrôleurs de vue et que vous souhaitez supprimer le texte arrière de tous, vous devrez ajouter la ligne dans les contrôleurs de vue 1 et 2.


5
C'est la meilleure solution que j'ai vue jusqu'à présent ne me donne aucun problème
lostAtSeaJoshua

4
.Plaina été changé en .plain. Pas de capital p.
Gal

Parfait..! C'est ce que je veux.
JD.

Meilleure solution. Merci.
Baran Emre

1
@ GastónAntonioMontes, il fonctionne sur iOS13, mais il est un peu contre - intuitif: le titre vide backBarButtonItem doit être déclarée sur le pousser contrôleur de vue, pas poussé un
Martin

49

Après avoir beaucoup recherché, j'ai trouvé la solution la meilleure et la plus simple, cela affectera tous les viewControllers écrits dans Swift 4.2 et fonctionnant également dans Swift 5

extension UIViewController {
    open override func awakeFromNib() {
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }  
}

Welcome @ e.dimitrow
iOS Lifee

1
Fonctionne comme du charme
Jerry Oka pour le

3
Notez que cela ne fonctionnera que si votre ViewController est contenu dans un Storyboard ou Nib ...
Nathaniel Blumer

1
Une solution géniale!
WM

3
Cela fonctionnait pour moi, mais plus (cela fonctionne toujours sur les simulateurs iOS 12, mais pas sur le dernier iOS 13) ...
tanya

35

Le texte du bouton de retour dépend du titre de la vue principale.

L'astuce consiste à effacer le titre si la vue principale disparaît et à le redéfinir s'il est à nouveau affiché:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // needed to clear the text in the back navigation:
    self.navigationItem.title = " "
}

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

33

Si vous voulez supprimer le titre d'un bouton de retour d'un contrôleur de vue poussé, disons <Settingsà <en subSettingsViewController alors vous avez à mettre backBarButtonItem titre dans SettingsViewController de viewWillDisappear () méthode.

Objectif c:

- (void)viewWillDisappear:(BOOL)animated
    [super viewWillDisappear:animated];
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
}

Rapide:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

1
.Plaina été changé en .plain. Pas de capital p.
Gal

1
La réponse doit être mise à jour pour le comportement de searchController. Par exemple, si vous utilisez un resultsVC séparé et appuyez sur un élément qui pousse un autre VC, la méthode viewWillDisappear du searchController initial n'est pas appelée, donc le titre est toujours là
H4Hugo

Ce n'est pas une bonne approche si vous recherchez une solution pour les écrans dans l'ensemble de l'application. - Si vous ajoutez ce code à un "Base View Controller", viewWillDisappear du premier contrôleur de vue sera appelé après viewDidAppear du deuxième contrôleur de vue (où vous définissez généralement le titre) ... cela gâchera les titres. Le meilleur moyen est d'écraser le bouton de retour
Mithra Singam

Solution parfaite merci
SURESH SANKE

28

Si vous voulez une flèche de retour, le code suivant est mis dans le fichier AppDelegate dans la méthode didFinishLaunchingWithOptions.

Pour Swift

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)

2
j'aime celui-ci car vous pouvez standardiser le style de votre application dans un seul fichier et l'appeler une fois depuis le délégué de l'application
Aaronium112

4
C'est une solution vraiment sympa et rapide, mais ... cela pourrait être difficile si vous avez d'autres éléments de bouton de barre à l'exception de celui de l'arrière
:)

3
Une remarque, si vous implémentez uniquement l'attribut ".normal", vous verrez le texte au clic. Ajoutez la même ligne pour «.selected», «.highlighted» et «.disabled». pour vous assurer que vous ne voyez pas le texte scintillant.
Nick N

1
Je pense que cela aura un effet secondaire, d'autres boutons de barre que les boutons arrière seront également affectés et auront une couleur de texte claire :(
dhin

24

Dans mon cas, pour l'icône et le titre personnalisés, cela a fait l'affaire (Swift 4)

    let imgBack = UIImage(named: "ic_back")

    navigationController?.navigationBar.backIndicatorImage = imgBack
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = imgBack

    navigationItem.leftItemsSupplementBackButton = true
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)

1
la dernière ligne de ce code fonctionnait parfaitement pour moi. Toutes les autres suggestions n'ont pas fonctionné, probablement parce que mes contrôleurs de vue sont tous contrôlés par un contrôleur de navigation. Dans quel cas, le navigationController? est vraiment nécessaire.
Salx

Vous aurez besoin des quatre premières lignes si vous souhaitez ajouter un bouton de retour personnalisé. Sinon, la dernière ligne fera l'affaire.
Rafiqul Hasan

14

J'ai résolu ce problème en ajoutant un "" sur le titre StoryBoard du ViewController précédent. Juste un espace, pas vide; D

entrez la description de l'image ici


J'ai besoin de l'écran précédent pour avoir un titre, donc je suppose que cela ne fonctionnera pas pour moi.
lmiguelvargasf

2
J'ai effacé ce titre, mais le titre arrive toujours dans le titre du bouton arrière
Himali Shah

1
ne pas effacer le titre, le champ, mettre "" (espace) dans le champ du bouton Retour
Kiril S.

13

Enfin trouvé la solution parfaite.

Ajoutez simplement une image transparente et ajoutez le code suivant dans votre AppDelegate.

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)

1
C'est certainement la meilleure réponse. J'utilisais auparavant le UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustmenthack recommandé par la plupart des autres réponses, mais il était cassé sur l'iPhone X pour les contrôleurs de vue avec de longs titres. Cette solution fonctionne parfaitement.
Ned

3
Meilleure réponse. Fonctionne mieux que la couleur du texte transparent.
William T.

1
Meilleure solution que j'ai utilisée ces 4 dernières années! Vous le faites une fois, en un seul endroit et pour tous les contrôleurs de vue !!!
korgx9

1
Lorsque j'ai essayé cela avec iOS 12, le texte apparaissait toujours à côté de l'image. :(
Sean McMains

13

dans swift 4

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

Merci, cela m'a aidé, (Swift 4.0, Xcode 10.1, iOS 12.1.1), merci
infinity_coding7

3
MAIS, vous perdrez votre titre dans le vc parent
Wei Lu

1
Si un grand titre est présent, topItem est largeTitle. Ne fonctionne pas
Saranjith

10

Pour Swift 4+ mettre ces lignes dans AppDelegateaudidFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)      
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

Lorsque vous définissez l'apparence dans le délégué d'application, la couleur de premier plan claire est pour chaque UIBarButtonItem, n'est-ce pas? Donc, si j'ajoute un UIBarButtonItem avec un texte, dois-je changer la couleur de premier plan de ce bouton manuellement?
kuzdu

1
C'est bien, mais lorsque vous appuyez sur le bouton de retour, le texte s'affiche toujours
William T.

Cela fonctionne mais fait disparaître d'autres boutons de la barre dans iOS 11. La réponse de Rafiqul Hasan ci-dessus peut résoudre le problème
huync

8

Cela fonctionne pour moi

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

Corriger un. Dans iOS 13, navigationItem.backBarButtonItem ne fonctionne pas. Cela m'a sauvé des heures d'efforts. Merci
Manish le

5

Si vous avez un ViewControllerA et que vous souhaitez accéder au ViewControllerB, dans le ViewControllerA, vous devez définir le navigationItem actuel avec un nouvel UIBarButtonItem et le titre sur une chaîne avec un espace vide avant de pousser vers un autre contrôleur de vue:

Définissez le titre sur une chaîne avec un espace vide, vous ne pouvez pas définir nil ou "" (chaîne vide) car la valeur par défaut est nil

let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)

5

Mettez ce code dans chaque VC qui en pousse un autre

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

3
let button: UIButton = UIButton (type: UIButtonType.Custom)
button.setImage(UIImage(named: "imageName"), forState: UIControlState.Normal)
button.addTarget(self, action: "backButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
button.frame = CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem(customView: button)

self.navigationItem.leftBarButtonItem = barButton

func backButtonPressed(btn : UIButton) {

    // Your code
}

3

Pour supprimer de tous les contrôleurs de vue dans une pile de contrôleurs de navigation:

sous-classe UINavigationController et ajoutez ceci:

override func show(_ vc: UIViewController, sender: Any?) {
    setEmptyBackButton(vc)
    super.show(vc, sender: sender)
}

override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    setEmptyBackButton(viewController)
    super.pushViewController(viewController, animated: animated)
}

func setEmptyBackButton(_ viewController: UIViewController) {
    viewController.navigationItem.backBarButtonItem =
        UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

2

Parfois, cela ne fonctionne pas pour changer uniquement la couleur du titre, au cas où le titre serait long. Parce que cela pourrait déplacer le titre de la barre de navigation vers la gauche. Donc, pour éviter cela, vous devrez peut-être déplacer le titre du bouton de la barre horizontalement en plus de le rendre transparent:

let barButtonItemAppearance = UIBarButtonItem.appearance()
    barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

2

Détails

  • Xcode version 10.2.1 (10E1001), Swift 5

Solution

1. Créez une classe personnalisée de UINavigationController

import UIKit

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

2. Ajoutez l'extension UIViewController

import UIKit

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

3. Mettez à jour votre classe ViewController

import UIKit

class ViewController: UIViewController {
    override var navigationItemBackButtonTextIsHidden: Bool { return true }
}

Échantillon complet

import UIKit

// MARK: - ViewController

class ViewController: UIViewController {

    var screenCounter = 1

    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavigationItem()
    }

    override var navigationItemBackButtonTextIsHidden: Bool { return (screenCounter % 2) == 0 }
}

extension ViewController {

    private func setupNavigationItem() {
        navigationItem.title = "VC \(screenCounter)"
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "push", style: .plain, target: self, action: #selector(pushBarButtonTouchedUpInside))
    }

    @objc func pushBarButtonTouchedUpInside(button: UIBarButtonItem) {
        guard let navigationController = navigationController else { return }
        let viewController = ViewController()
        viewController.screenCounter = screenCounter + 1
        viewController.view.backgroundColor = .white
        navigationController.pushViewController(viewController, animated: true)
    }
}

// MARK: - NavigationController

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

// MARK: - UIViewController extension

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

Résultat

entrez la description de l'image ici


1

Pour moi, cela a fait l'affaire:

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

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationItem.title = "my amazing title"
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

Notez que si vous définissez uniquement le titre sans modifier le backBarButtonItem, il semblera fonctionner. Mais si vous essayez de revenir en arrière en utilisant un geste et d' annuler et de rester sur le contrôleur de vue poussée, le titre arrière reviendra.

Travailler dans Swift 4


Pourriez-vous expliquer?
mrc

J'ai un contrôleur qui affiche toujours le texte de retour avec le bouton de retour. Donc, le code ci-dessus ne fonctionne pas dans mon cas
Shahbaz Akram

1

Vous devez sélectionner la barre de navigation du contrôleur à partir de laquelle le bouton de retour pointera et tapez "" dans le champ Bouton de retour.

Par exemple, si vous poussez le contrôleur A vers le contrôleur B, placez un espace dans la barre de navigation du contrôleur A.


1

Xcode 10, Swift 4+

Réponse similaire aux autres ici mais il est à noter que si le texte n'est toujours pas effacé, vous devez cliquer sur Espace puis sur Entrée.

entrez la description de l'image ici


1

Une alternative pour remplacer tout ViewControllerspour moi était d'étendre UINavigationControlleret de définir backBarButtonItemle topViewController.

Swift 5 sur Xcode 11.2.1:

extension UINavigationController {
    override open func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let backButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
        self.topViewController?.navigationItem.backBarButtonItem = backButton
    }
}

1

Le moyen le plus simple de le faire par programme consiste à définir à backBarButtonItempartir du contrôleur de vue parent (un contrôleur qui appelle push).

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

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

Plus de détails ici https://sarunw.com/posts/how-to-remove-text-from-uinavigationbar-back-button/


1

Vous pouvez supprimer le texte du bouton Précédent à l'aide d'une méthode déléguée de UINavigationController.

class CustomNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

}

extension CustomNavigationController: UINavigationControllerDelegate {
    
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: String(), style: .plain, target: nil, action: nil)
    }
    
}

0

Dans Xcode 9.2 avec Swift, cela fonctionnait comme ceci:

override func viewWillDisappear(_ animated: Bool) {
   super.viewWillDisappear(true)
   navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

0

Dans le cas où nous ne contrôlons pas du tout le contrôleur de vue précédent (c'est-à-dire si nous travaillons dans un framework), nous pouvons supprimer le titre du bouton de retour comme suit:

// For iOS 10
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = String()

// For iOS 11
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = nil

Ce qu'il fait est de naviguer jusqu'au dernier élément de la pile de navigation et de supprimer son titre arrière. Assurez-vous de sauvegarder l'original lorsque notre contrôleur de vue apparaîtra:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    originalBackButtonTitle = navigationController?.navigationBar.items?.last?.backBarButtonItem?.title
    // Delete title somewhere here...
}

puis réaffectez-le, afin de ne perturber aucune partie de l'application:

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
    super.viewWillDisappear(animated)
}

0

Cela résoudra votre problème:

    import UIKit

    extension UINavigationController{

    func customizeBackArrow(){
        let yourBackImage = UIImage(named: "icon_back_arrow")
        self.navigationBar.backIndicatorImage = yourBackImage
        self.navigationBar.tintColor = Common.offBlackColor
        self.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
        navigationItem.leftItemsSupplementBackButton = true
        self.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", 
           style: .plain, target: self, action: nil)

    }
}

0

J'ai essayé quelques réponses et je ne peux pas les faire fonctionner dans tous les cas. Il s'agit donc d'une solution de contournement pour ne pas affecter le titre de la barre de navigation s'il est défini.

    guard let items = viewController.navigationController?.navigationBar.items else { return }
    for item in items {
        if item.title == nil {
            item.title = ""
        }
    }

0

La méthode de programmation simple, sans effets secondaires indésirables, consiste à initialiser le navigationItem.backBarButtonItem avec un élément vide dans la méthode awakeFromNib du contrôleur source (celui à partir duquel vous naviguez):

override func awakeFromNib() {
    super.awakeFromNib()
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

Remarque: si vous initialisiez le bouton de retour plus tard, comme dans la méthode viewDidLoad () , vous perdriez le balayage arrière fonctionnalité de (glisser du bord gauche vers la droite vous ramènera un pas en arrière dans la pile de navigation).

Ensuite, si vous voulez différents textes de bouton de retour pour différents contrôleurs de destination et si vous utilisez des segues, vous pouvez définir le titre dans la méthode prepare (for segue :, sender :) , comme ceci:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let item = navigationItem.backBarButtonItem {
        switch segue.identifier {
        case "SceneOne": item.title = "Back"; break
        case "SceneTwo": item.title = "Home"; break
        case "SceneThree": item.title = nil; break // Use this scene's title
        default: item.title = "" // No text
        }
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.