Chcę usunąć tekst z przycisku Wstecz, ale chcę zachować ikonę. próbowałem
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
Jednak powoduje to całkowite usunięcie tekstu i ikony.
Wiem, że ma już odpowiedź, ale możesz to również zrobić w kodzie (na wypadek, gdybyś pracował ze stalówkami)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Dodaj powyższe w pierwszym kontrolerze widoku.
Zauważ, że musisz to zrobić dla każdego kontrolera widoku, który naciska. Więc jeśli masz 3 kontrolery widoku i chcesz usunąć tekst z tyłu z nich wszystkich, musisz dodać linię w kontrolerach widoku 1 i 2.
źródło
.Plain
został zmieniony na.plain
. Brak dużej litery p.Po wielu poszukiwaniach znalazłem najlepsze i proste rozwiązanie, wpłynie to na wszystkie kontrolery widoku napisane w Swift 4.2, a także działające w Swift 5
extension UIViewController { open override func awakeFromNib() { navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) } }
źródło
Tekst przycisku Wstecz zależy od tytułu widoku głównego.
Sztuczka polega na tym, aby wyczyścić tytuł, jeśli widok główny zniknął, i ustawić go ponownie, jeśli zostanie ponownie wyświetlony:
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" }
źródło
Jeśli chcesz usunąć tytuł przycisku wstecz z popychane kontrolera widoku, powiedzmy,
<Settings
aby<
w subSettingsViewController wtedy masz ustawić backBarButtonItem tytuł SettingsViewController za viewWillDisappear () metody.Cel C:
- (void)viewWillDisappear:(BOOL)animated [super viewWillDisappear:animated]; self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil]; }
Szybki:
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }
źródło
.Plain
został zmieniony na.plain
. Brak dużej litery p.Jeśli chcesz strzałkę wstecz, postępuj zgodnie z kodem umieszczonym w pliku AppDelegate w metodzie didFinishLaunchingWithOptions.
Dla Swift
let BarButtonItemAppearance = UIBarButtonItem.appearance() BarButtonItemAppearance.setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
źródło
W moim przypadku, w przypadku niestandardowej ikony i tytułu, to załatwiło sprawę (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)
źródło
Rozwiązałem ten problem, dodając znak „” w tytule StoryBoard poprzedniego ViewController. Tylko przestrzeń, a nie pusta; D.
źródło
Wreszcie znalazłem idealne rozwiązanie.
Po prostu dodaj jeden przezroczysty obraz i dodaj następujący kod w swoim AppDelegate.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
źródło
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment
hackowania, które poleca większość innych odpowiedzi, ale na iPhonie X był zepsuty dla kontrolerów widoku z długimi tytułami. To rozwiązanie działa bez zarzutu.w szybkim 4
self.navigationController?.navigationBar.topItem?.title = ""
źródło
To działa dla mnie
override func viewDidLoad() { super.viewDidLoad() navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }
źródło
W przypadku Swift 4+ umieść te linie w
AppDelegate
atdidFinishLaunchingWithOptions
let BarButtonItemAppearance = UIBarButtonItem.appearance() BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal) BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
źródło
Jeśli masz ViewControllerA i chcesz przejść do ViewControllerB, w ViewControllerA, powinieneś ustawić bieżący navigationItem z nowym UIBarButtonItem i tytułem na ciąg z pustą spacją przed wypchnięciem do innego kontrolera widoku:
Ustaw tytuł jako ciąg z pustą spacją, nie możesz ustawić nil ani „” (pusty ciąg), ponieważ wartość domyślna to zero
let backItem = UIBarButtonItem() backItem.title = " " navigationItem.backBarButtonItem = backItem let controllerB = ViewControllerB() navigationController?.pushViewController(controllerB, animated: true)
źródło
ViewControllerB
(nawet jeśli to zawsze działało do tej pory, w moim szczególnym przypadku), to było jedyne rozwiązanie, które zadziałało dla mnieUmieść ten kod w każdym VC, który wypycha inny
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
źródło
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 }
źródło
Aby usunąć ze wszystkich kontrolerów widoku w stosie kontrolerów nawigacji:
podklasę UINavigationController i dodaj to:
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) }
źródło
Czasami nie działa zmiana tylko koloru tytułu, w przypadku, gdy tytuł jest długi. Ponieważ może to spowodować przesunięcie tytułu paska nawigacji w lewo. Aby temu zapobiec, może być konieczne przesunięcie tytułu przycisku paska w poziomie, aby był on przezroczysty:
let barButtonItemAppearance = UIBarButtonItem.appearance() barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal) barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
źródło
Detale
Rozwiązanie
1. Utwórz niestandardową klasę 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. Dodaj rozszerzenie UIViewController
import UIKit extension UIViewController { @objc var navigationItemBackButtonTextIsHidden: Bool { return false } }
3. Zaktualizuj klasę ViewController
import UIKit class ViewController: UIViewController { override var navigationItemBackButtonTextIsHidden: Bool { return true } }
Pełna próbka
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 } }
Wynik
źródło
Możesz usunąć tekst z przycisku Wstecz za pomocą metody delegata
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) } }
źródło
Dla mnie to załatwiło sprawę:
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) }
Zauważ, że jeśli tylko ustawić tytuł bez modyfikacji z backBarButtonItem będzie pojawiać do pracy. Ale jeśli spróbujesz wrócić za pomocą gestu, a następnie anulujesz i pozostaniesz na wciśniętym kontrolerze widoku, tytuł z powrotem wróci.
Praca w Swift 4
źródło
Należy wybrać pasek nawigacyjny kontrolera, Z którego będzie wskazywał przycisk Wstecz i wpisać „” w polu Przycisk Wstecz.
np. jeśli pchasz kontroler A do kontrolera B, umieść spacje w pasku nawigacji kontrolera A.
źródło
Xcode 10, Swift 4+
Podobna odpowiedź do innych tutaj, ale warto zauważyć, że jeśli tekst nadal nie jest wyczyszczony, musisz kliknąć spację, a następnie Enter.
źródło
Wypróbowałem kilka odpowiedzi i nie mogę ich zmusić do działania we wszystkich przypadkach. Jest to więc obejście, które nie wpływa na tytuł paska nawigacji, jeśli jest ustawiony.
guard let items = viewController.navigationController?.navigationBar.items else { return } for item in items { if item.title == nil { item.title = "" } }
źródło
Jedną z alternatyw przesłonić wszystko
ViewControllers
dla mnie było rozszerzenieUINavigationController
i ustawićbackBarButtonItem
ztopViewController
.Swift 5
w 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 } }
źródło
Najłatwiejszym sposobem zrobienia tego programowo jest ustawienie
backBarButtonItem
z poziomu nadrzędnego kontrolera widoku (kontrolera, który wywołuje wypychanie).class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) navigationItem.backBarButtonItem = backBarButtonItem } }
Więcej szczegółów tutaj https://sarunw.com/posts/how-to-remove-text-from-uinavigationbar-back-button/
źródło
W Xcode 9.2 ze Swiftem działało tak:
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(true) navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }
źródło
W przypadku, gdy w ogóle nie mamy kontroli nad poprzednim kontrolerem widoku (tj. Jeśli pracujemy w frameworku), możemy usunąć tytuł przycisku wstecz w następujący sposób:
// For iOS 10 navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = String() // For iOS 11 navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = nil
To, co robi, to przejście do ostatniego elementu stosu nawigacji i usunięcie jego wstecznego tytułu. Pamiętaj, aby zapisać oryginalny, gdy pojawi się nasz kontroler widoku:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) originalBackButtonTitle = navigationController?.navigationBar.items?.last?.backBarButtonItem?.title // Delete title somewhere here... }
a następnie przydziel go ponownie, aby nie zakłócać żadnej części aplikacji:
override func viewWillDisappear(_ animated: Bool) { navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle super.viewWillDisappear(animated) }
źródło
To rozwiąże Twój problem:
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) } }
źródło
Łatwym sposobem programistycznym, bez niepożądanych efektów ubocznych, jest zainicjowanie navigationItem.backBarButtonItem z pustym elementem w metodzie awakeFromNib kontrolera źródłowego (tego, z którego nawigujesz):
override func awakeFromNib() { super.awakeFromNib() navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }
Uwaga: Jeśli później zainicjowałeś przycisk Wstecz, tak jak w metodzie viewDidLoad () , stracisz funkcję swipe-back (przesunięcie od lewej krawędzi do prawej powoduje cofnięcie się o jeden krok w stosie nawigacji).
Następnie, jeśli chcesz mieć różne teksty przycisku Wstecz dla różnych kontrolerów docelowych i jeśli używasz segue , możesz ustawić tytuł w metodzie Przygotuj (dla segue :, nadawca :) , na przykład:
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 } } }
źródło