Entfernen Sie den Text von der Schaltfläche "Zurück", wobei das Symbol beibehalten wird

90

Ich möchte den Text von der Schaltfläche "Zurück" entfernen, aber 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.

lmiguelvargasf
quelle

Antworten:

98

Die Methode von @ rmd2 ist fast richtig, aber stattdessen sollten Sie die Navigationsleiste des Controllers auswählen, auf die die Zurück-Schaltfläche zeigt, und " "das Feld Zurück- Schaltfläche eingeben .

Geben Sie hier die Bildbeschreibung ein

m8labs
quelle
1
Schlimmstenfalls, wenn der Viewcontroller nicht über die Navigationsleiste verfügt, muss ich hinzufügen, um den Text zu entfernen
Daniel Beltrami
139

Ich weiß, dass dies bereits eine Antwort hat, aber Sie können dies 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 Ansichts-Controller hinzu.

Beachten Sie, dass Sie dies für jeden View Controller tun müssen, der pusht. Wenn Sie also 3 Ansichts-Controller haben und den hinteren Text von allen entfernen möchten, müssen Sie die Zeile in den Ansichts-Controllern 1 und 2 hinzufügen.

d9rad
quelle
5
Dies ist die beste Lösung, die ich bisher gesehen habe, macht mir keine Probleme
lostAtSeaJoshua
4
.Plainwurde geändert in .plain. Kein Kapital p.
Gal
Perfekt..! Das ist, was ich will.
JD.
Beste Lösung. Vielen Dank.
Baran Emre
1
GastónAntonioMontes @, es funktioniert auf iOS13, aber es ist ein bisschen unlogisch: den leeren Titel backBarButtonItem sollte auf dem deklariert werden drückt View - Controller, nicht geschoben ein
Martin
49

Nachdem ich viel gesucht habe , habe ich die beste und einfachste Lösung gefunden. Dies wirkt sich auf alle viewController aus, die in Swift 4.2 geschrieben wurden und auch in Swift 5 funktionieren

extension UIViewController {
    open override func awakeFromNib() {
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }  
}
iOS Lifee
quelle
Willkommen @ e.dimitrow
iOS Lifee
1
Funktioniert wie Charme
Jerry Okafor
3
Beachten Sie, dass dies nur funktioniert, wenn Ihr ViewController in einem Storyboard oder einer Feder enthalten ist ...
Nathaniel Blumer
1
Eine geniale Lösung!
WM
3
Dies funktionierte früher für mich, aber nicht mehr (es funktioniert immer noch auf iOS 12-Simulatoren, nur nicht auf dem neuesten iOS 13) ...
Tanja
33

Wenn Sie den Titel einer Zurück-Schaltfläche von einem Push- View-Controller entfernen möchten <Settings, beispielsweise <in subSettingsViewController, müssen Sie den Titel backBarButtonItem 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)
}
Muhammad Umair
quelle
1
.Plainwurde geändert in .plain. Kein Kapital p.
Gal
1
Die Antwort muss für das Verhalten von searchController aktualisiert werden. Wenn Sie beispielsweise eine separate Ergebnis-VC verwenden und auf ein Element tippen, das eine andere VC überträgt, wird die viewWillDisappear-Methode aus dem anfänglichen searchController nicht aufgerufen, daher ist der Titel immer noch vorhanden
H4Hugo
Dies ist kein guter Ansatz, wenn Sie nach einer Lösung für Bildschirme in der gesamten App suchen. - Wenn Sie diesen Code zu einem "Base View Controller" hinzufügen, wird viewWillDisappear des ersten View Controllers nach viewDidAppear des zweiten View Controllers aufgerufen (wo Sie normalerweise den Titel festlegen). Dadurch werden die Titel durcheinander gebracht. Der beste Weg ist, den Zurück-Button zu überschreiben
Mithra Singam
Perfekte Lösung Danke
SURESH SANKE
33

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(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"
}
Stefan
quelle
27

Wenn Sie einen Zurückpfeil wünschen, fügen Sie den folgenden Code in die AppDelegate-Datei in die didFinishLaunchingWithOptions-Methode ein.

Für Swift

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
Pradeep Bishnoi
quelle
2
Ich mag dieses, weil Sie den Stil Ihrer App in einer einzigen Datei standardisieren und sie einmal vom App-Delegaten
aufrufen können
4
Es ist wirklich eine schöne und schnelle Lösung, aber ... es könnte schwierig sein, wenn Sie andere
Balkenknopfelemente
3
Eine Beobachtung: Wenn Sie nur das Attribut ".normal" implementieren, wird der Text beim Klicken angezeigt. Fügen Sie dieselbe Zeile für ".selected", ".highlighted" und ".disabled" hinzu. um sicherzustellen, dass Sie den Flimmertext nicht sehen.
Nick N
1
Ich denke, dies wird einen Nebeneffekt haben, andere Balkentasten außer den hinteren Tasten werden ebenfalls betroffen sein und eine klare
Textfarbe
23

In meinem Fall hat dies für benutzerdefinierte Symbole und Titel den Trick getan (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)
Rafiqul Hasan
quelle
1
Die letzte Zeile in diesem Code hat bei mir einwandfrei funktioniert. Alle anderen Vorschläge haben nicht funktioniert, wahrscheinlich weil meine View Controller alle von einem Navi Controller gesteuert werden. In welchem ​​Fall ist der Navigationscontroller? ist wirklich erforderlich.
Salx
Sie benötigen die oberen vier Zeilen, wenn Sie eine benutzerdefinierte Zurück-Schaltfläche hinzufügen möchten. Andernfalls hat die letzte Zeile den Trick getan.
Rafiqul Hasan
14

Ich habe dieses Problem gelöst, indem ich dem StoryBoard-Titel des vorherigen ViewControllers ein "" hinzugefügt habe. Nur ein Leerzeichen, nicht leer; D.

Geben Sie hier die Bildbeschreibung ein

rmd2
quelle
Ich brauche den vorherigen Bildschirm, um einen Titel zu haben, also denke ich, dass das für mich nicht funktionieren wird.
lmiguelvargasf
2
Ich habe diesen Titel ausgeblendet, aber der Titel kommt immer noch in den Zurück-Button-Titel
Himali Shah
1
Leeren Sie nicht den Titel, das Feld, setzen Sie "" (Leerzeichen) in das Feld "Zurück"
Kiril S.
13

Endlich die perfekte Lösung gefunden.

Fügen Sie einfach ein transparentes Bild hinzu und fügen Sie den folgenden Code in Ihr AppDelegate ein.

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
Lalit Kumar
quelle
1
Dies ist definitiv die beste Antwort. Ich habe zuvor den UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustmentHack verwendet, den die meisten anderen Antworten empfehlen, aber er war auf dem iPhone X für View Controller mit langen Titeln defekt. Diese Lösung funktioniert einwandfrei.
Ned
3
Beste Antwort. Funktionierte besser als transparente Textfarbe.
William T.
1
Beste Lösung, die ich in den letzten 4 Jahren verwendet habe! Du machst es einmal, an einem Ort und für alle Viewcontroller !!!
Korgx9
1
Als ich dies mit iOS 12 versuchte, erschien der Text immer noch neben dem Bild. :(
Sean McMains
13

in schnell 4

self.navigationController?.navigationBar.topItem?.title = ""
Amalendu Kar
quelle
Danke, es hat mir geholfen (Swift 4.0, Xcode 10.1, iOS 12.1.1), danke
infinity_coding7
3
ABER, Sie werden Ihren Titel in Eltern vc
Wei Lu
1
Wenn ein großer Titel vorhanden ist, ist topItem largeTitle. Funktioniert nicht
Saranjith
10

Für Swift 4+ setzen Sie diese Zeilen in AppDelegateatdidFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)      
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
BilalReffas
quelle
Wenn Sie das Erscheinungsbild im App-Delegaten festlegen, gilt für jedes UIBarButtonItem die klare Vordergrundfarbe, nicht wahr? Wenn ich also ein UIBarButtonItem mit einem Text hinzufüge, muss ich die Vordergrundfarbe für diese Schaltfläche manuell ändern?
Kuzdu
1
Das ist gut, aber wenn Sie den Zurück-Knopf drücken, wird immer noch der Text
William T.
Es funktioniert, aber andere Balkenschaltflächen verschwinden in iOS 11. Die Antwort von Rafiqul Hasan oben kann das Problem beheben
huync
8

Das funktioniert bei mir

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
RomanV
quelle
Richtig. In iOS 13 funktioniert navigationItem.backBarButtonItem nicht. Das hat mir stundenlange Mühe erspart. Danke
Manish
5

Wenn Sie über einen ViewControllerA verfügen und zum ViewControllerB navigieren möchten, sollten Sie im ViewControllerA das aktuelle Navigationselement mit einem neuen UIBarButtonItem und den Titel auf eine Zeichenfolge mit Leerzeichen setzen, bevor Sie zu einem anderen Ansichtscontroller wechseln:

Setzen Sie den Titel auf eine Zeichenfolge mit einem Leerzeichen. Sie können weder nil noch "" (leere Zeichenfolge) festlegen, da der Standardwert nil ist

let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)
Bradley
quelle
5

Fügen Sie diesen Code in jede VC ein, die eine andere drückt

navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
Polina Hill
quelle
3
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
}
Hasya
quelle
3

So entfernen Sie alle Viewcontroller in einem Navigationscontroller-Stack:

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)
}
Gaston Gonzalez
quelle
2

Manchmal funktioniert es nicht, nur die Titelfarbe zu ändern, falls der Titel lang ist. Weil der Titel der Navigationsleiste möglicherweise nach links verschoben wird. Um dies zu verhindern, müssen Sie möglicherweise den Titel der Balkenschaltfläche 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)
Max Niagolov
quelle
1

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 es anscheinend funktioniert , wenn Sie nur den Titel festlegen, ohne das backBarButtonItem zu ändern . Aber wenn Sie versuchen, mit einer Geste zurückzukehren und dann abzubrechen und auf dem Push-View-Controller zu bleiben, wird der Titel zurück angezeigt.

Arbeiten in Swift 4

mrc
quelle
Könntest du erklären?
mrc
Ich habe einen Controller, der immer Back-Text mit Back-Button anzeigt. Also oben Code funktioniert in meinem Fall nicht
Shahbaz Akram
1

Sie sollten die Navigationsleiste des Controllers auswählen, von der aus die Zurück-Schaltfläche zeigt, und "" in das Feld Zurück-Schaltfläche eingeben.

Wenn Sie beispielsweise einen A-Controller auf einen B-Controller schieben, fügen Sie Leerzeichen in die Navigationsleiste eines Controllers ein.

Tushar Raikwar
quelle
1

Xcode 10, Swift 4+

Ähnliche Antwort wie bei den anderen hier, aber es ist erwähnenswert, dass Sie, wenn der Text immer noch nicht gelöscht wird, auf Leertaste und dann auf Eingabe klicken müssen.

Geben Sie hier die Bildbeschreibung ein

Aishat Olowoshile
quelle
1

Einzelheiten

  • Xcode Version 10.2.1 (10E1001), Swift 5

Lösung

1. Erstellen Sie eine benutzerdefinierte Klasse des 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. Fügen Sie die UIViewController-Erweiterung hinzu

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 }
}

Vollständige Probe

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 }
}

Ergebnis

Geben Sie hier die Bildbeschreibung ein

Wassili Bodnarchuk
quelle
1

Eine Alternative, um alles ViewControllersfür mich außer Kraft zu setzen , war das Erweitern UINavigationControllerund Einstellen backBarButtonItemdes topViewController.

Swift 5 auf 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
    }
}
Unglücklich
quelle
1

Der einfachste Weg, dies programmgesteuert zu tun, besteht darin, backBarButtonItemüber die übergeordnete Ansichtssteuerung (eine Steuerung, die Push aufruft) festzulegen.

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        navigationItem.backBarButtonItem = backBarButtonItem
    }
}

Weitere Details hier https://sarunw.com/posts/how-to-remove-text-from-uinavigationbar-back-button/

sarunw
quelle
1

Sie können Text von der Zurück-Schaltfläche mit einer Delegatmethode von entfernen 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)
    }
    
}
keval
quelle
0

In Xcode 9.2 mit Swift hat es so funktioniert:

override func viewWillDisappear(_ animated: Bool) {
   super.viewWillDisappear(true)
   navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
Thiago Bueno
quelle
0

Für den Fall, dass wir den vorherigen Ansichts-Controller überhaupt nicht steuern können (dh 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 Sie das Original speichern, 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 neu zu, um keinen Teil der App zu stören:

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
    super.viewWillDisappear(animated)
}
Ángel Téllez
quelle
0

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)

    }
}
mossman252
quelle
0

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 sie festgelegt ist.

    guard let items = viewController.navigationController?.navigationBar.items else { return }
    for item in items {
        if item.title == nil {
            item.title = ""
        }
    }
Rikard Platus
quelle
0

Die einfache programmatische Weise, ohne unerwünschte Nebenwirkungen, ist es, die Initialisierung navigationItem.backBarButtonItem mit einem leeren Element in der awakeFromNib Methode des Quellenregler (die Sie von der Navigation):

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

Hinweis: Wenn Sie die Schaltfläche "Zurück" später wie bei der Methode " viewDidLoad ()" initialisiert haben , verlieren Sie das Zurückwischen Funktion "Zurückwischen" (wenn Sie vom linken Rand nach rechts Sie einen Schritt zurück in den Navigationsstapel).

Wenn Sie dann unterschiedliche Back-Button-Texte für verschiedene Ziel-Controller wünschen und Segues verwenden, können Sie den Titel in der Methode prepare (for segue:, sender :) wie folgt festlegen :

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
        }
    }
}
Jiri Volejnik
quelle