So entfernen Sie alle Titel der Zurückschaltfläche der Navigationsleiste


81

Wenn ich a drücke UIViewController, hat es einen Titel in der Zurück-Schaltfläche bei Neu UIViewController, wenn der Titel viel Text enthält, sieht es in iPhone 4s nicht gut aus. Also möchte ich ihn entfernen.

Wenn ich Code in die prepareForSegueFunktion einfüge, wird es ein Problem sein.

Gibt es einen besseren Weg, um dies zu erreichen?


Sie können auch den Titel der Zurück-Schaltfläche ändern. und um zurück zu gehen, benötigen Sie die Schaltfläche Zurück. Ich denke also, dass ich den Zurück-Button nicht entfernen muss.
Ashok Londhe

Bitte informieren Sie nach der Lösung Ihres Problems.
Ashok Londhe

Verweisen Sie auf diese Antwort stackoverflow.com/a/48801613/3976183
Lalit Kumar

Es gibt einen schönen Artikel zu diesem Thema. sarunw.com/posts/…
user3672430

Antworten:


128

Wenn Sie einen Zurückpfeil wünschen, geben Sie den folgenden Code in die AppDelegateDatei in die didFinishLaunchingWithOptionsMethode ein.

For Objective-C

 [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

For Swift

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)

Eine weitere Option geben Sie unten.

Im Objective C

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

Im Swift

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

UPDATE:

    let BarButtonItemAppearance = UIBarButtonItem.appearance()

    let attributes: [NSAttributedStringKey: Any] = [
    BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
            NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
            NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

UPDATE SWIFT 4.1:

    let attributes = [NSAttributedStringKey.font:  UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]

    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
    BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)

Offset verwenden

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)

Vielleicht wurde Ihr Problem gelöst.

Viel Spaß beim Codieren.


8
setBackButtonTitlePositionAdjustmentfunktioniert nicht immer, wenn der Titel der Zurück-Schaltfläche sehr lang ist, aber nicht lang genug, um zu "Zurück" zu wechseln, wird der Titel in der Mitte nach rechts verschoben.
Zgjie

3
@zgjie es ist nur ein Thema, wie groß Ihr Offset ist. Sie können '-60' leicht durch '-6000' ersetzen und dieses Problem vergessen
slxl

9
Nur ein wenig Präzision hier, der Titel gehört zum PREVIOUS View Controller. Denken Sie also daran, es dort vor der Methode presentViewController oder pushViewController festzulegen.
Benjamin

1
Hmm, das funktioniert in AppDelegate nicht. "Wert vom Typ AppDelegate hat kein Mitgliedsnavigationselement"
Prabhu

3
@DominikBucher Ich habe eine Kategorie für dieses Verhalten erstellt, die den Titel der Zurück-Schaltfläche an jeder Stelle in der App verbirgt, was irgendwie "NICHT HACKIG" ist. Fügen Sie einfach die Kategorie in Ihr Projekt ein und Sie sind fertig. Ich bin mit der Lösung der Positionseinstellung nicht einverstanden. setBackButtonTitlePositionAdjustment:forBarMetrics:Wenn der Benutzer die Schaltflächenform in den Eingabehilfen aktiviert hat, wird die Form als hässliche Navigationsleiste angezeigt.
Pratik Jamariya

71

Arbeit ist wie Charme bei Swift 3

self.navigationController?.navigationBar.topItem?.title = " "

1
Dies ist die einzige, die bei der Verwendung funktioniert hatnavigationController?.pushViewController(_, animated:)
D. Greg

Danke, Kumpel. Dieser war der einzige, der geklappt hat. Prost.
Felipe

3
Arbeitete für mich auch Swift 4
christijk

1
@MaksimKniazev, eine Lösung für dieses Problem? Ich habe die einzige Lösung gefunden, um den Titel in erneut zu aktualisieren viewWillAppear:.
Hemang

4
Dies entfernt den Titel der vorherigen Ansicht
Naser Mohamed

50

Ich verwende diese Codezeile in der AppDelegateDatei in didFinishLaunchingWithOptionsMethode, um den Backbutton zu entfernen 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)

17
setBackButtonTitlePositionAdjustmentfunktioniert nicht immer, wenn der Titel der Zurück-Schaltfläche sehr lang ist, aber nicht lang genug, um zu "Zurück" zu wechseln, wird der Titel in der Mitte nach rechts verschoben.
Zgjie

Es ist keine ideale Lösung. Wenn Sie einen Navigationstitel festlegen, ohne den Titel des linken Navigationsleistenelements zu ändern, wird der Titel nach rechts verschoben, da Titeleinfügungen in der linken Navigationsleiste vorhanden sind.
Mathema

2
In iOS 11 wird die Position der Zurück-Taste unterbrochen. Es fällt unter seine ursprüngliche Position
Korgx9

Wie soll das gehen? Der Text ist weiterhin über VoiceOver zugänglich.
Lukasz Ciastko

Dies schafft ein Problem, wenn Abbrechen oder Fertig Barbuttonitem nicht sichtbar sind, wenn Bildauswahl oder etwas präsentiert
Nupur Sharma

17

Gehen Sie einfach zu Ihrem übergeordneten ViewController, von dem Ihre anderen ViewController abhängig sind.

override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}

15

Kopieren Sie einfach diesen Code in didFinishLaunchingWithOptions launchOptions

Swift 5

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)

Swift 4

UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)

11

es ist einfach. Setzen Sie ein Leerzeichen in den Titel der Zurück-Schaltfläche und fertig. Denken Sie daran, dass es sich in der vorherigen Ansicht befinden muss, in der Sie den Text entfernen möchten.

Geben Sie hier die Bildbeschreibung ein


Beste Lösung IMO. Sie müssen nicht die gesamte App auf einen bestimmten klaren Stil einstellen, der den Nebeneffekt haben kann, dass Text-Barbutton-Elemente verschwinden. Die Antwort könnte besser sein, wenn erwähnt wird, dass Sie ein Navigationselement auf Ihren Controller ziehen müssen, wenn dort keines vorhanden ist.
TheJeff

7

Sie können xcode 8 und swift 3.0 verwenden

self.navigationController?.navigationBar.backItem?.title = " "

3
Wird dadurch nicht der Titel vollständig aus dem vorherigen Ansichts-Controller entfernt?
NRitH

1
Ja, es wird den Titel für alle ViewControllers entfernt vonself.navigationController
Yevhen Dubinin

7

Sie können eine Unterklasse für alle erstellen UIViewController s Sie dieses Verhalten wünschen, und in den Unterklassen viewDidLoad:

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

Auf diese Weise können Sie auswählen, für welche Controller das Verhalten gewünscht wird, ohne den Code zu duplizieren. Ich bevorzuge, dass meine Controller nur "Zurück" sagen, anstatt den Titel des vorherigen Controllers, also setze ich diesen Titel hier.


6
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)

hat diese Codezeile in Swift 3.0 verwendet


1
wird die Abbrechen-Schaltfläche für UISearchController
JAHelia

5

Lassen Sie sich von der Antwort von rordulu hier inspirierenIch ließ inspirieren und erstellte schließlich einen benutzerdefinierten UINavigationController und eine UINavigation-Leiste, die alle Fälle dieses kniffligen Problems zu behandeln scheinen.

1) Initialisieren Sie neu UINavigationControllermit Ihrer Gewohnheit UINavigationBar:

class CustomNavigationController: UINavigationController {

    convenience init() {
        self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
    }
}

2) Setzen Sie die backItem.titleEigenschaft der Navigationsleiste jedes Mal, wenn sich die Ansicht selbst anzeigt, auf eine leere Zeichenfolge

class CustomNavigationBar: UINavigationBar {

    override func layoutSubviews() {
        backItem?.title = ""
        super.layoutSubviews()
    }
}

Jedes Mal, wenn Sie diese Kombination aus Navigationscontroller und Leiste verwenden, wird der Text der Zurück-Schaltfläche nie mehr angezeigt! 🎉

Hinweis: Dies sollte auch bei Verwendung von Storyboards problemlos funktionieren. Stellen Sie lediglich sicher, dass die benutzerdefinierte Navigationsleistenkomponente in der Ansicht abgelegt wird


Erstaunlich vielen Dank! Dies ist der beste Weg, um es zu tun und sollte die richtige Antwort sein :)
GameDev

3
Ich habe gerade festgestellt, dass dies einen Nebeneffekt hat, da der Titel des Navigationselements vollständig gelöscht wird. Wenn also die vorherige Ansicht zeigt, hat es keinen Titel! Ich werde meine Suche nach der perfekten Lösung für dieses nervige Problem fortsetzen.
Harry Bloom

Verdammt, du hast recht. Wie könnte ich das vermissen! Bitte sagen Sie mir, wenn Sie eine Lösung für dieses Problem finden. danke
GameDev

Könnten Sie die perfekte Lösung @HarryBloom finden?
Hemang

@Hemang Keine perfekte Lösung, aber ich habe etwas gefunden, das funktioniert. Habe hier eine zweite Antwort hinzugefügt stackoverflow.com/a/49094282/1532838
Harry Bloom

3

Normalerweise füge ich die Schaltfläche "Zurück" in viewDidLoad des UIViewController hinzu oder ändere sie.

So etwas sollte funktionieren:

let leftButton = UIBarButtonItem(title: "Back", style:     UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton

Vergessen Sie nicht, die aufgerufene Funktion zum Schließen der Ansicht zu ändern und zu implementieren.

Noch einfacher, ändern Sie einfach den Titel:

self.navigationItem.leftBarButtonItem.title = "Back"

7
Dies unterbricht die integrierte Unterstützung von iOS für das Wischen von links nach rechts, um zurück zu navigieren, und meiner Meinung nach sind Apps, die dies unterbrechen, wirklich irritierend.
NRitH

2

Swift 3:

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

2

Hier eine zweite Antwort hinzufügen, da meine erste nur teilweise funktioniert. Diese Methode ist weniger elegant, da in jeder Ansicht der Anwendung eine Methode aufgerufen werden muss, sie funktioniert jedoch ohne Nebenwirkungen.

Erstellen Sie zunächst eine UIViewController-Erweiterungsklasse mit einer Funktion zum Entfernen des Textes der Zurück-Schaltfläche und zum Hinzufügen einer benutzerdefinierten Zurück-Schaltfläche:

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

Zweitens können wir diese Funktion einfach in viewDidLoadjedem View Controller aufrufen, in dem Sie sie benötigen.


2

Einfache Lösung:

Fügen Sie self.navigationItem.title = "" in viewWillDisappear des 1. Controllers ein, während Sie den 2. Controller vom 1. Controller verschieben . Der Titel der Zurück-Schaltfläche wird vom 2. Controller ausgeblendet.

Die obige Anweisung verbirgt den Titel des 1. Controllers. Wenn wir zurückkommen, möchten wir wieder den Titel für den 1. Controller. Dafür haben wir den Titel für den 1. Controller in der viewWillAppear- Methode des 1. Controllers hinzugefügt .

Siehe folgende Methoden (des 1. Controllers)

    override func viewWillDisappear(_ animated: Bool) {
    self.navigationItem.title = ""
}

override func viewWillAppear(_ animated: Bool) {
    self.navigationItem.title = "Title"
}

2

Swift 4.2

UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)

Abbrechen und Fertig Schaltfläche von Bildauswahl ist in diesem Ansatz verschwunden
Nupur Sharma

2

Aktualisierte Antwort für Swift 4.2

Die Arbeit mit UIAppearanceist eine sauberere Art, das Problem zu lösen, aber es würde dazu führen, dass alle UIBarButtonItemeinen klaren Text haben. Eine verbesserte Version der Lösung könnte darin bestehen, zu überprüfen, ob die UIBarButtonItemin a enthalten ist UINavigationBar.

    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)

1

Funktioniert mit Swift 5 :

        self.navigationItem.backBarButtonItem?.title = ""

Bitte beachten Sie, dass dies für den nächsten Push-View-Controller wirksam ist, nicht für den aktuellen auf dem Display. Deshalb ist es sehr verwirrend!

Überprüfen Sie auch das Storyboard und wählen Sie das Navigationselement des vorherigen Ansichts-Controllers aus. Geben Sie dann etwas in die Schaltfläche Zurück (Inspektor) ein.


1

Ich habe eine einfache Lösung für diejenigen, die kein Methoden-Swizzling oder Duplizieren eines ähnlichen Codes in verschiedenen View-Controllern verwenden möchten.

Um den Titel der Zurück-Schaltfläche zu entfernen, erstellen Sie eine UINavigationController-Unterklasse und überschreiben Sie die pushViewController-Methode (_, animiert :):

final class CustomNavigationController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {

        super.pushViewController(viewController, animated: animated)

        let backBarButtonItem = UIBarButtonItem()
        backBarButtonItem.title = nil

        viewController.navigationItem.backBarButtonItem = backBarButtonItem
    }
}

0

Ich weiß nicht warum, aber ich habe ein Problem mit dem Ausblenden des Zurück-Button-Titels in iPhone Plus gefunden, aber in Geräten ohne Plus-Shows mit

leftBarButtonItem.title = ""

Also habe ich einen einfachen Weg gefunden. In der Navigationsleiste von NavigationViewController im Autolayout wird die Farbtonfarbe so eingestellt, dass sie gelöscht wird. Es kann problematisch sein, wenn Sie Symbole oder Textkacheln mit Farbton verwenden. Aber in meinem Fall benutze ich es nicht als alles.


0

Verwenden Sie einfach dies:

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
}

Rufen Sie diese Methode in viewDidLoad auf:

override func viewDidLoad() {
        super.viewDidLoad()
     removeBackButton(vc:self)
}

0

Sie können diese Erweiterung zu UIViewController hinzufügen und diese Funktion dann in jedem viewDidLoad () wie folgt aufrufen: self.updateBackButton ()

extension UIViewController {
func updateBackButton(){
    if self.navigationController != nil {
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
    }
}}

0

Ich möchte eine Lösung teilen, die für mich funktioniert. Es kann auch an Ihre Bedürfnisse und Anforderungen angepasst werden.

Beachten Sie, dass ich in meinem Fall ein Storyboard verwende, um CustomNavigationBar anzugeben

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

0

Funktioniert für Swift 4.2

Verwenden der Codezeile in der AppDelegateDatei indidFinishLaunchingWithOptions

    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)

Dies verbirgt den Text der hinteren Leistenschaltfläche, zentriert aber leider nicht den Titel der Navigationsleiste
Giorgio

0

Swift 4.2 & 5

Anstatt mit der Tönungsfarbe der Navigationsleiste zu spielen, die Nebenwirkungen hat, wenn Sie die Bildauswahl später in Ihrem Code verwenden.

Verwenden Sie den folgenden Code:

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

Rufen Sie es von Ihrem ersten ViewController aus auf:

self.awakeFromNib()

0

für schnelle 4,5

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)

0

Erstellen Sie einfach eine Erweiterung UIViewControllermit Override-Funktion awakeFromNib()und erstellen Sie UIBarButtonItemmit einem leeren Titel und geben Sie an navigation backBarButtonItem.

extension UIViewController {

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

}

0

Geben Sie den folgenden Code in einen der Codes ein, um den UIViewcontroller extensiongesamten UIViewcontrollerRückentext auszublenden

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

0

im viewDidLoad()

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

0

Ich habe eine einfache Lösung gefunden:

bei PersingtingViewController's viewWillDisappearMethode jsut setzen

self.title = ""

und stellt titlefür PersingtingViewController'son - viewWillAppearMethode. Und wiederholen Sie dies für alle viewControllersvon der navigationStackAusnahme letzte.


0

Unter iOS 14 ist die backButtonDisplayModeEigenschaft nun in der UINavigationItemKlasse vorhanden. Um den Titel der Zurück-Schaltfläche zu entfernen, können Sie ihn verwenden

navigationItem.backButtonDisplayMode = .minimal

in der Funktion viewDidLoaddes viewControllers, wo Sie es entfernen möchten.

Um es in allen Navigationsleisten zu entfernen, habe ich die Swizzling-Technik verwendet

import UIKit

private let swizzling: (UIViewController.Type, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        let didAddMethod = class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
        if didAddMethod {
            class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

extension UIViewController {
    
    static func swizzle() {
        let originalSelector1 = #selector(viewDidLoad)
        let swizzledSelector1 = #selector(swizzled_viewDidLoad)
        swizzling(UIViewController.self, originalSelector1, swizzledSelector1)
    }
    
    @objc open func swizzled_viewDidLoad() {
        if let _ = navigationController {
            if #available(iOS 14.0, *) {
                navigationItem.backButtonDisplayMode = .minimal
            } else {
                // Fallback on earlier versions
                navigationItem.backButtonTitle = ""
            }
        }
        swizzled_viewDidLoad()
    }
}

Und auf application(_:didFinishLaunchingWithOptions:)Abruf

UIViewController.swizzle()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.