web-dev-qa-db-fra.com

Supprimer le texte du bouton Précédent en gardant l'icône

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. 

53
lmiguelvargasf

La méthode de @ rmd2 est presque correcte, mais vous devez plutôt sélectionner la barre de navigation du contrôleur vers lequel le bouton Précédent va pointer vers et tapez " " dans le champ Bouton Précédent.

 enter image description here

67
m8labs

Je sais que cela a déjà une réponse, mais vous pouvez aussi le faire en code (si vous travaillez avec des nibs)

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 poussé. Donc, si vous avez 3 contrôleurs de vue et que vous souhaitez supprimer le texte précédent de tous, vous devez ajouter la ligne dans les contrôleurs de vue 1 et 2. 

93
d9rad

Si vous voulez supprimer le titre d'un bouton précédent d'un contrôleur de vue avancée, supposons que <Settings à < dans subSettingsViewController, puis vous devez définir le titre backBarButtonItem dans SettingsViewController viewWillDisappear () .

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)
}
26
Muhammad Umair

Le texte du bouton Précédent 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 s'affiche à nouveau:

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

    // 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"
}
21
Stefan

Si vous voulez revenir à la flèche, placez le code suivant dans le fichier AppDelegate dans la méthode didFinishLaunchingWithOptions.

Pour Swift

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

Dans mon cas, pour l'icône personnalisée et le titre, cela a fonctionné (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)
19
Rafiqul Hasan

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

 enter image description here

13
rmd2

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)
11
Lalit Kumar

Pour Swift 4+ mettez ces lignes dans AppDelegate à didFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

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

Après avoir beaucoup cherché, j'ai trouvé la solution la meilleure et la plus simple, cela affectera tous les viewControllers écrit en Swift 4.2

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

dans Swift 4

self.navigationController?.navigationBar.topItem?.title = ""
7
Amalendu Kar

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

Définit le titre sur une chaîne avec un espace, 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)
4
Bradley
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
Hasya

Pour supprimer de tous les contrôleurs de vue d'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
Gaston Gonzalez

Mettez ce code dans chaque VC qui en pousse un autre

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

Parfois, cela ne fonctionne pas pour changer uniquement la couleur du titre, dans le cas où le titre est long. Parce que cela pourrait décaler le titre de la barre de navigation vers la gauche. Pour éviter cela, vous devrez peut-être décaler 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
Max Niagolov

Xcode 10, Swift 4+

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

 enter image description here

1
Aishat Olowoshile

Pour moi, ça 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 apparaîtra pour fonctionner. Mais si vous essayez de revenir en arrière avec un geste et que cancel et restez sur le contrôleur de vue avancée, le titre précédent reviendra.

Travailler dans Swift 4

1
mrc

Vous devez sélectionner la barre de navigation du contrôleur À partir de laquelle le bouton Précédent va pointer vers et tapez "" dans le champ Bouton Précédent.

par exemple, si vous poussez un contrôleur entre deux contrôleurs, mettez les espaces dans la barre de navigation d'un contrôleur.

1
Tushar Raikwar

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
mossman252

Détails

  • Xcode version 10.2.1 (10E1001), Swift 5

Solution

1. Créer 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. Ajouter une 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

enter image description here

0
Vasily Bodnarchuk

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 si elle est définie.

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

Pour le cas où nous n’avons pas du tout le contrôle du contrôleur de vue précédent (c’est-à-dire si nous travaillons dans un cadre), nous pouvons supprimer le titre du bouton Précédent 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 précédent. 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...
}

et ensuite le réaffecter, afin de ne pas perturber aucune partie de l'application:

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
    super.viewWillDisappear(animated)
}
0
Ángel Téllez

Dans Xcode 9.2 avec Swift, cela fonctionnait comme suit:

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

J'ai utilisé ce code dans la fonction didFinishLaunchingWithOptions d'Appdelegate.

if #available(iOS 11, *) {
            UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
            UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .highlighted)
        } else {
            UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0,
                                                                                           -60), for:UIBarMetrics.default)
        }
0
Varun Naharia