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?
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)
Travailler comme un charme sur Swift 3
self.navigationController?.navigationBar.topItem?.title = " "
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)}
Vous pouvez utiliser xcode 8 et Swift 3.0
self.navigationController?.navigationBar.backItem?.title = " "
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
utilisé cette ligne de code dans Swift 3.0
Vous pouvez créer une sous-classe pour tous les UIViewController
s 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.
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
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"
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"
}
Swift 3:
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
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.
Il suffit de copier ce code dans didFinishLaunchingWithOptions launchOptions
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
Swift 4.2
UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
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)
}
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)
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.
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)
}
}}
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()
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)
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()
}
}