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.

lmiguelvargasf
la source

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

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

d9rad
la source
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)
    }  
}
Vie iOS
la source
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"
}
Stefan
la source
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)
}
Muhammad Umair
la source
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)
Pradeep Bishnoi
la source
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)
Rafiqul Hasan
la source
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

rmd2
la source
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)
Lalit Kumar
la source
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 = ""
Amalendu Kar
la source
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)
BilalReffas
la source
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)
}
RomanV
la source
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)
Bradley
la source
5

Mettez ce code dans chaque VC qui en pousse un autre

navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Polina Hill
la source
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
}
Hasya
la source
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)
}
Gaston Gonzalez
la source
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)
Max Niagolov
la source
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

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

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

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

Aishat Olowoshile
la source
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
    }
}
Malchanceux
la source
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/

sarunw
la source
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)
    }
    
}
Keval
la source
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)
}
Thiago Bueno
la source
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)
}
Ángel Téllez
la source
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)

    }
}
mossman252
la source
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 = ""
        }
    }
Rikard Platus
la source
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
        }
    }
}
Jiri Volejnik
la source