web-dev-qa-db-fra.com

Comment supprimer tout le titre du bouton de retour de la barre de navigation

Lorsque j'appuie sur une UIViewController, il y a un titre dans le bouton précédent de la nouvelle UIViewController, si le titre contient beaucoup de texte, cela n'a pas l'air bien dans l'iPhone 4s.

Si j'ajoute du code dans la fonction prepareForSegue, ce sera un problème.

Un meilleur moyen d'y parvenir?

60
jansma

J'utilise cette ligne de code dans le fichier AppDelegate dans la méthode didFinishLaunchingWithOptions pour supprimer le backbutton title.

Swift 2.x

let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)

Swift 3.x

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

Swift 4.x

UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: UIControlState.highlighted)
45
Karthickkck

Travailler comme un charme sur Swift 3 

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

Il suffit d’aller dans votre ViewController parent / d’où dépendent vos autres ViewControllers.

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

Vous pouvez utiliser xcode 8 et Swift 3.0 

self.navigationController?.navigationBar.backItem?.title = " "
8
Anit Kumar
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

utilisé cette ligne de code dans Swift 3.0

6
Kiran jadhav

c'est simple. mettez un espace dans le titre du bouton précédent et préparez-vous . N'oubliez pas qu'il doit être dans la vue précédente où vous souhaitez supprimer le texte.

 enter image description here

5
oscar castellon

Vous pouvez créer une sous-classe pour tous les UIViewControllers pour lesquels vous souhaitez ce comportement, et dans la viewDidLoad de la sous-classe:

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

De cette façon, vous pouvez choisir les contrôleurs pour lesquels vous voulez le comportement, sans dupliquer le code. Je préfère que mes contrôleurs disent simplement "Back", plutôt que le titre du contrôleur précédent, alors je règle ce titre ici.

5
Connor

S'inspirant de de rordulu answer here , j'ai fini par créer un UINavigationController et une barre UINavigation personnalisés qui semblent gérer tous les cas de ce problème épineux.

1) Initialisez new UINavigationController avec votre UINavigationBar personnalisé:

class CustomNavigationController: UINavigationController {

    convenience init() {
        self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
    }
}

2) Définissez la propriété backItem.title de la barre de navigation sur une chaîne vide, chaque fois que la vue se présente

class CustomNavigationBar: UINavigationBar {

    override func layoutSubviews() {
        backItem?.title = ""
        super.layoutSubviews()
    }
}

Désormais, chaque fois que vous utiliserez cette combinaison de contrôleur de navigation et de barre, il n’aura jamais de texte de bouton arrière! ????

Remarque: cela devrait fonctionner correctement si vous utilisez également des storyboards, assurez-vous simplement de déposer le composant barre de navigation personnalisé dans la vue

5
Harry Bloom

J'ai l'habitude d'ajouter ou de changer le bouton de retour dans viewDidLoad de UIViewController. 

Quelque chose comme ça devrait marcher:

let leftButton = UIBarButtonItem(title: "Back", style:     UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton

N'oubliez pas de changer et d'implémenter la fonction qui s'appelle pour fermer la vue.

Encore plus facile, il suffit de changer le titre:

self.navigationItem.leftBarButtonItem.title = "Back"
3
pteofil

Solution simple:

Pendant que vous appuyez sur le 2e contrôleur depuis le 1er contrôleur, insérez self.navigationItem.title = "" in viewWillDisappear du 1er contrôleur. Il cache le titre du bouton du 2e contrôleur.

L'afficheur ci-dessus masque le premier titre de contrôleur. C'est pourquoi, lorsque nous sommes revenus, nous voulons à nouveau le titre du premier contrôleur. Pour cela, nous avons ajouter le titre pour le 1er contrôleur dans viewWillAppear méthode du 1er contrôleur.

Reportez-vous aux méthodes suivantes (du 1er contrôleur)

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

override func viewWillAppear(_ animated: Bool) {
    self.navigationItem.title = "Title"
}
2
Mayur Shinde

Swift 3:

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

Ajouter une deuxième réponse ici car ma première ne fonctionne que partiellement. Cette méthode est moins élégante dans le fait qu’elle nécessite l’appel d’une méthode dans chaque vue de l’application, mais elle fonctionne sans aucun effet secondaire.

Donc, tout d’abord, créez une classe d’extension UIViewController avec une fonction permettant de supprimer le texte du bouton Précédent et d’ajouter un bouton Précédent personnalisé:

extension UIViewController {

func setBackButton() {
    navigationController?.navigationBar.backIndicatorImage = R.image.backArrow()
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = R.image.backArrow()
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

Deuxièmement, nous pouvons simplement appeler cette fonction dans la viewDidLoad de chaque contrôleur de vue pour lequel vous en avez besoin.

2
Harry Bloom

Swift 4

Il suffit de copier ce code dans didFinishLaunchingWithOptions launchOptions 

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
1
Vivek

Swift 4.2

UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
1
Abhishek Jain

Il suffit d'utiliser ceci: 

func removeBackButton(vc:UIViewController) {
        let button = UIButton.init(type: .custom)
        button.setImage(UIImage.init(named:""), for: .normal)
        let leftBarButton = UIBarButtonItem.init(customView: button)
        vc.navigationItem.leftBarButtonItem = leftBarButton
}

Alors appelez cette méthode dans viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()
     removeBackButton(vc:self)
}
0
reza_khalafi

Réponse mise à jour pour Swift 4.2

Travailler avec UIAppearance est une façon plus simple de résoudre le problème, mais cela donnerait à tout UIBarButtonItem un texte clair. Une version améliorée de la solution pourrait consister à vérifier si la UIBarButtonItem est contenue dans une UINavigationBar

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
0
Md. Ibrahim Hassan

Je ne sais pas pourquoi mais j'ai eu du mal à cacher le titre du bouton de retour dans les avantages de l'iPhone, mais dans l'appareil sans les spectacles plus corrects avec 

leftBarButtonItem.title = ""

J'ai donc trouvé un moyen simple. La couleur de teinte est définie sur ClearBar dans NavigationBar de NavigationViewController dans Autolayout. Cela peut poser problème si vous utilisez des icônes ou des vignettes de texte teintées. Mais dans mon cas, je ne l'utilise pas comme tout.

0
Vasily Avilov

Vous pouvez ajouter cette extension à UIViewController Ensuite, appelez cette fonction dans chaque viewDidLoad () Like: self.updateBackButton ()

extension UIViewController {
func updateBackButton(){
    if self.navigationController != nil {
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
    }
}}
0
Talha Ahmad Khan

Swift 4.2 & 5

Au lieu de jouer avec la couleur de la barre de navigation qui aura des effets secondaires si vous utilisez le sélecteur d’images à un moment ultérieur dans votre code.

Utilisez le code ci-dessous:

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

Appelez-le depuis votre premier ViewController:

self.awakeFromNib()
0
Md Rais

Fonctionne pour Swift 4.2

Utilisation de la ligne de code dans le fichier AppDelegate dans le fichier didFinishLaunchingWithOptions

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)
0
veradiego31

J'aimerais partager une solution qui fonctionne pour moi. En outre, il peut être ajusté en fonction de vos besoins et exigences.

Notez que dans mon cas, j'utilise un storyboard pour spécifier CustomNavigationBar.

Swift 4.2

class CustomNavigationBar: UINavigationBar {

    override func awakeFromNib() {
        super.awakeFromNib()
        guard let topItem = topItem else { return }
        removeBackButtonTitle(for: topItem)
    }

    override func pushItem(_ item: UINavigationItem, animated: Bool) {
        removeBackButtonTitle(for: item)
        super.pushItem(item, animated: animated)
    }

    func removeBackButtonTitle(for item: UINavigationItem) {
        item.backBarButtonItem = UIBarButtonItem()
    }
}
0
ixi