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.
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.
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)
}
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"
}
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)
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)
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)
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)
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)
}
}
dans Swift 4
self.navigationController?.navigationBar.topItem?.title = ""
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)
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
}
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)
}
Mettez ce code dans chaque VC qui en pousse un autre
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
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)
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
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.
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)
}
}
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 }
}
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 }
}
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 = ""
}
}
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)
}
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)
}
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)
}