Ich möchte den Text von der Zurück-Schaltfläche entfernen, aber ich möchte das Symbol beibehalten. Ich habe versucht
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
Dadurch werden jedoch der Text und das Symbol vollständig entfernt.
Ich weiß, das hat bereits eine Antwort, aber Sie können es auch im Code tun (falls Sie mit Schreibfedern arbeiten)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Fügen Sie das Obige im ersten View-Controller hinzu.
Beachten Sie, dass Sie dies für jeden View-Controller tun müssen, der den Push durchführt. Wenn Sie also 3 Ansichtscontroller haben und den Hintergrundtext von allen entfernen möchten, müssen Sie die Zeile in den Viewcontroller 1 und 2 hinzufügen.
Wenn Sie den Titel einer Zurück-Schaltfläche von einem Push-View-Controller entfernen möchten, sagen wir <Settings
bis <
in subSettingsViewController. Dann müssen Sie den backBarButtonItem - Titel in der viewWillDisappear ()-Methode von SettingsViewController festlegen.
Ziel c:
- (void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
}
Schnell:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Der Text der Zurück-Schaltfläche hängt vom Titel der Master-Ansicht ab.
Der Trick besteht darin, den Titel zu löschen, wenn die Masteransicht verschwindet, und ihn erneut festzulegen, wenn er erneut angezeigt wird:
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"
}
Wenn Sie den Pfeil zurücksetzen möchten, fügen Sie folgenden Code in die AppDelegate-Datei in der Methode didFinishLaunchingWithOptions ein.
Für Swift
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
In meinem Fall für benutzerdefiniertes Symbol und Titel hat dies den Trick (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)
Endlich die perfekte Lösung gefunden.
Fügen Sie einfach ein transparentes Bild hinzu und fügen Sie folgenden Code in Ihre AppDelegate ein.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Für Swift 4+ Diese Zeilen in AppDelegate
um didFinishLaunchingWithOptions
setzen
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
Nachdem ich viel gesucht hatte, fand ich die beste und einfachste Lösung. Dies wirkt sich auf alle in Swift 4.2 geschriebenen viewControllers aus.
extension UIViewController {
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
in Swift 4
self.navigationController?.navigationBar.topItem?.title = ""
Wenn Sie über einen ViewControllerA verfügen und zum ViewControllerB navigieren möchten, sollten Sie im ViewControllerA das aktuelle navigationItem mit einem neuen UIBarButtonItem und dem Titel auf eine Zeichenfolge mit Leerzeichen vor Push an einen anderen View-Controller setzen:
Setzt den Titel auf eine Zeichenfolge mit einem Leerzeichen. Sie können weder nil noch "" (leere Zeichenfolge) festlegen, da der Standardwert nilist.
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
}
So entfernen Sie von allen Viewcontrollern in einem Navigationscontrollerstack:
unterklasse UINavigationController und fügen Sie Folgendes hinzu:
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)
}
Fügen Sie diesen Code in jedes VC ein, das einen anderen drückt
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Manchmal funktioniert es nicht, nur die Titelfarbe zu ändern, falls der Titel lang ist. Es könnte den Titel der Navigationsleiste nach links verschieben. Um dies zu verhindern, müssen Sie den Balkentastentitel zusätzlich horizontal verschieben, um ihn transparent zu machen:
let barButtonItemAppearance = UIBarButtonItem.appearance()
barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
Für mich war das der Trick:
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)
}
Beachten Sie, dass wenn Sie nur den Titel ohne Änderung des backBarButtonItem setzen,angezeigt wird, um zu funktionieren. Wenn Sie versuchen, mit einer Geste zurück zu gehen und dann cancel zu bleiben und auf dem gedrückten Ansichts-Controller zu bleiben, wird der hintere Titel zurückgegeben.
Arbeiten in Swift 4
Wählen Sie die Navigationsleiste des Controllers FROM aus, auf die die Zurück-Schaltfläche zeigt, und geben Sie "" in das Feld "Zurück-Schaltfläche" ein.
wenn Sie beispielsweise einen A-Controller auf einen B-Controller schieben, geben Sie Leerzeichen in die Navigationsleiste des A-Controllers ein.
Dies wird Ihr Problem lösen:
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. Erstelle eine benutzerdefinierte Klasse des UINavigationControllers
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. UIViewController-Erweiterung hinzufügen
import UIKit
extension UIViewController {
@objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}
3. Aktualisieren Sie Ihre ViewController-Klasse
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 }
}
Ich habe ein paar Antworten ausprobiert und kann sie nicht in allen Fällen zum Laufen bringen. Dies ist also eine Problemumgehung, um den Titel der Navigationsleiste nicht zu beeinflussen, wenn er festgelegt ist.
guard let items = viewController.navigationController?.navigationBar.items else { return }
for item in items {
if item.title == nil {
item.title = ""
}
}
Für den Fall, dass wir den vorherigen View-Controller überhaupt nicht steuern können (d. H. Wenn wir in einem Framework arbeiten), können wir den Titel der Zurück-Schaltfläche wie folgt löschen:
// For iOS 10
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = String()
// For iOS 11
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = nil
Sie navigieren zum letzten Element des Navigationsstapels und löschen dessen hinteren Titel. Stellen Sie sicher, dass das Original gespeichert wird, wenn unser View Controller angezeigt wird:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
originalBackButtonTitle = navigationController?.navigationBar.items?.last?.backBarButtonItem?.title
// Delete title somewhere here...
}
und weisen Sie es dann erneut zu, um keinen Teil der App zu stören:
override func viewWillDisappear(_ animated: Bool) {
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
super.viewWillDisappear(animated)
}
In Xcode 9.2 mit Swift funktionierte es so:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Ich habe diesen Code in der Funktion didFinishLaunchingWithOptions von Appdelegate verwendet.
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)
}