So setzen Sie den Schaltflächentext in Swift zurück

207

Wie entferne ich den Text der Zurück-Schaltfläche?

Aktuelle Zurück-Taste:

<Zurück

Gewünschter Zurück-Button:

<Alles andere

Keines davon hat funktioniert:

self.navigationItem.backBarButtonItem?.title = "Back"
self.backItem?.title = ""
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationItem.backBarButtonItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title="Back"
self.navigationController?.navigationBar.backItem?.title = ""
self.navigationController?.navigationItem.backBarButtonItem?.title
Onichan
quelle

Antworten:

604

Die Zurück-Schaltfläche gehört zum vorherigen Ansichts-Controller und nicht zu dem aktuell auf dem Bildschirm angezeigten.
Um die Zurück-Schaltfläche zu ändern, sollten Sie sie vor dem Drücken auf dem Ansichts-Controller aktualisieren , der den Übergang initiiert hat:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let backItem = UIBarButtonItem()
    backItem.title = "Something Else"
    navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
}

Swift 3, 4 & 5:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let backItem = UIBarButtonItem()
    backItem.title = "Something Else"
    navigationItem.backBarButtonItem = backItem // This will show in the next view controller being pushed
}

ODER

// in your viewDidLoad or viewWillAppear
navigationItem.backBarButtonItem = UIBarButtonItem(
    title: "Something Else", style: .plain, target: nil, action: nil)
Yariv Nissim
quelle
9
Vielen Dank, Sie wissen nicht, wie viele Stunden ich nur für dieses kleine Detail (den vorherigen Controller) verbringe
Ricardo
3
Wenn ich eine Million Mal upvoten könnte, würde ich. Ich kann Ihnen nicht sagen, wie lange ich mich gefragt habe, warum es nicht funktioniert hat (war zuvor auf dem Ziel-Controller)
Dylan Ireland,
13
"Die Zurück-Schaltfläche gehört zum vorherigen Ansichts-Controller" ist die wertvollste Antwort, die ich zu diesem Thema gefunden habe! Danke dir!
Vhristoskov
1
Durch das Einstellen der titleÄnderungen wird der Titel geändert , nicht nur die Zurück-Schaltfläche.
Yariv Nissim
4
Ich habe self.navigationController .navigationBar.topItem .backBarButtonItem = backItem statt navigationItem.backBarButtonItem = backItem und es funktioniert gut auf Swift 3. Vielen Dank!
Indra Adam
125

Sie können dies vom Interface Builder aus wie folgt tun:

Klicken Sie auf das Navigationselement des vorherigen Ansichtscontrollers

Geben Sie hier die Bildbeschreibung ein

Stellen Sie im Attributinspektor den Text der Zurück-Schaltfläche auf den gewünschten Wert ein. Das ist es!!

Geben Sie hier die Bildbeschreibung ein

Ajinkya Patil
quelle
1
Was ist der beste Weg, um 'Null' zuzuweisen?
Kennydust
@ kennydust Meinst du leeren Titel?
Ajinkya Patil
8
@ Kennethydust ja in der Zurück-Schaltfläche fügen Sie Leerzeichen und drücken Sie die Eingabetaste
Ajinkya Patil
Schön und einfach, aber ist es lokalisierbar?
Gruntcakes
2
@ AjinkyaPatil Ich habe es versucht, aber die Schaltfläche Zurück wird nicht angezeigt. Gibt es einen Grund, warum dies sein kann?
user805981
48

Der Text der Zurück-Schaltfläche wird aus dem Titel des Navigationselements des übergeordneten View-Controllers übernommen. Was auch immer Sie im Titel des Navigationselements des vorherigen View-Controllers festgelegt haben, wird im Text der Zurück-Schaltfläche des aktuellen View-Controllers angezeigt. Sie können einfach "" als Titel für das Navigationselement in die viewWillAppear-Methode des übergeordneten View-Controllers einfügen.

self.navigationItem.title = ""

Ein anderer Weg ist zu setzen

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

in der viewWillAppear-Methode des aktuellen View Controllers. Dieser verursacht ein anderes Problem, wenn der Navigationsstapel zu verschachtelt ist.

Minhazur
quelle
5
self.navigationItem.title = "" sollte als beste Antwort oben stehen!
Rilar
Ich stimme dem als beste Antwort zu, da alle obigen Antworten das Hinzufügen einer Zielfunktion zum Navigationselement erfordern, sodass sie nicht nur den Text ändern, sondern auch eine benutzerdefinierte Pop-Funktion hinzufügen, die für die Frage nicht erforderlich ist!
IsPha
Dies funktioniert gut in prepareForSegue, was ist. ein wenig sauberer, weil Sie den neuen viewController nach dem Laden nicht ändern.
Adrian
Passt auf!!! Setzen Sie self.title = "....." vor den Aufruf von self.navigationItem.title = ""
Bary Levy
45

Sie können diese 3 Codezeilen in dasViewController Feld einfügen, in dem Sie den Titel der Zurück-Schaltfläche ändern möchten.

In deinem override func viewDidLoad() {}.

let backButton = UIBarButtonItem()
backButton.title = "My Back Button Title"
self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
Hitesh Chauhan
quelle
2
Diese Lösung scheint korrekter zu sein, da Sie die Logik in die ankommende VC einfügen und nicht in die VC, die Sie verlassen. Aka: liest besser.
Eonist
37

Wenn Sie die xib-Datei für den View Controller verwenden, tun Sie dies in Ihrer View Controller-Klasse.

class AboutUsViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    edgesForExtendedLayout = []
    setUpNavBar()
}

func setUpNavBar(){
    //For title in navigation bar
    self.navigationController?.view.backgroundColor = UIColor.white
    self.navigationController?.view.tintColor = UIColor.orange
    self.navigationItem.title = "About Us"

    //For back button in navigation bar
    let backButton = UIBarButtonItem()
    backButton.title = "Back"
    self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
}

}

Das Ergebnis wird sein:

Geben Sie hier die Bildbeschreibung ein

mustaq
quelle
29

Ich weiß nicht, wo Sie Ihre Methoden verwendet haben, die Sie auf Ihre Frage gestellt haben, aber ich könnte das gewünschte Ergebnis erzielen, wenn ich für meine ViewControllerKlasse (in der ich den Zurück-Button ändern möchte) für die viewDidLoad()Funktion die folgende Zeile verwende:

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

Das Ergebnis wird sein:

Vor

Geben Sie hier die Bildbeschreibung ein

Nach dem

Geben Sie hier die Bildbeschreibung ein

Francisco Romero
quelle
3
In meinem Fall hat es nur funktioniert, wenn Sie diesen Code auf die viewDidAppear-Methode und nicht auf die viewDidLoad-Methode setzen
apinho
2
Verwenden Sie navigationController.navigationBar.topItem?.title = ""stattdessen, um dies nicht zu vermeidenviewDidAppear
José
Dies scheint der zufriedenstellendste Weg zu sein und vermeidet einen Blitz, da der Titel der Zurück-Schaltfläche im aufrufenden Controller (langsamere Geräte) mit self.navigationItem.title = "" in "" geändert wird. Auch die andere Situation, in der self.navigationItem.title = "" vollständig ignoriert wird und zeitweise über einen Tab-Controller-Tab-Schalter programmgesteuert schnell in den View-Controller übergeht.
FlimFlam Vir
22

Die Zurück-Schaltfläche gehört zum vorherigen Ansichts-Controller und nicht zu dem aktuell auf dem Bildschirm angezeigten. Fügen Sie viewdidload hinzu, um die Zurück-Schaltfläche zu ändern, bevor Sie sie drücken.

Swift 4:

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

Sie können das Navigationselement einfach im Storyboard ändern

Geben Sie hier die Bildbeschreibung ein

Fügen Sie im Zurück-Button ein Leerzeichen hinzu und drücken Sie die Eingabetaste.

Hinweis: Tun Sie dies in der vorherigen VC.

Xhinoda
quelle
8

Swift 4 - Konfigurieren Sie die Zurück-Taste, bevor Sie einen View Controller drücken

// if you want to remove the text
navigationItem.backBarButtonItem = UIBarButtonItem()

// if you want to modify the text to "back"
navigationItem.backBarButtonItem = UIBarButtonItem(title: "back", style: .plain, target: nil, action: nil)
Budidino
quelle
8

Das sollte funktionieren:

override func viewDidLoad() {
    super.viewDidLoad()

    var button = UIBarButtonItem(title: "YourTitle", style: UIBarButtonItemStyle.Bordered, target: self, action: "goBack")
    self.navigationItem.backBarButtonItem = button

}

func goBack()
{
    self.navigationController?.popViewControllerAnimated(true)
}

Dies wird zwar nicht empfohlen, da dies tatsächlich den backButton ersetzt und auch den Zurückpfeil und die Wischgeste entfernt.

Dejan Skledar
quelle
10
nicht der richtige Weg, es zu tun, Sie ersetzen nur den Zurück-Knopf
Yariv Nissim
Besser vom Interface Builder
Rutger Huijsmans
7

Swift 4.2

Wenn Sie den Elementtext der Navigationsleiste für die Schaltfläche "Zurück" ändern möchten, geben Sie diesen in viewDidLoadden Controller ein, bevor der Text angezeigt wird, in dem die Schaltfläche "Zurück" angezeigt wird, NICHT in der Ansichtssteuerung, in der die Schaltfläche "Zurück" sichtbar ist.

 let backButton = UIBarButtonItem()
 backButton.title = "New Back Button Text"
 self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton

Wenn Sie den aktuellen Titeltext der Navigationsleiste ändern möchten, verwenden Sie den folgenden Code (beachten Sie, dass dies der Standardrücktext für die nächste Ansicht ist, die auf den Navigationscontroller übertragen wird, dieser Standardrücktext jedoch durch den obigen Code überschrieben werden kann).

 self.title = "Navigation Bar Title"
ikbal
quelle
6

Es gibt zwei Möglichkeiten.

1.In der vorherigenViewController.viewDidLoad ()

let backBarBtnItem = UIBarButtonItem()
backBarBtnItem.title = "back"
navigationItem.backBarButtonItem = backBarBtnItem

2.In der currentViewController.viewDidAppear ()

let backBarBtnItem = UIBarButtonItem()
backBarBtnItem.title = "back"      
navigationController?.navigationBar.backItem?.backBarButtonItem = backBarBtnItem

Grund: Das backButtonkommt von navigationBar.backItem.backBarButtonItem, daher ist der erste Weg offensichtlich. In currentViewController.viewDidLoad () können wir die Referenz von nicht erhalten backItem, da in viewDidAppear () das auf seine. Pushed navigationBargedrückt wird, sodass wir Änderungen an dem in currentViewController vornehmen können. viewDidAppear ()navigationViewstackbackItem

Weitere Informationen finden Sie unter Dokument: UINavigationBar

Calcifer
quelle
3

Fügen Sie in der viewDidLoadMethode des präsentierenden Controllers Folgendes hinzu:

// hide navigation bar title in the next controller
let backButton = UIBarButtonItem(title: "", style:.Plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backButton
Claus
quelle
2

Diese Antworten beheben zwar das Problem, aber dies könnte nützlich sein

class MainNavigatioController: UINavigationController {

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        // first
        let backItem = UIBarButtonItem()
        backItem.title = "رجوع"
        self.viewControllers.last?.navigationItem.backBarButtonItem = backItem
        // then
        super.pushViewController(viewController, animated: animated)

    }

}
Ahmad Labeeb
quelle
2

Swift 4

Während das vorherige Sprichwort zur Vorbereitung auf das Segue korrekt ist und der Zurück-Button zum vorherigen VC gehört, fügt es nur eine Menge unnötigen Codes hinzu.

Am besten legen Sie den Titel der aktuellen VC in viewDidLoad fest und der Titel der Zurück-Schaltfläche wird bei der nächsten VC automatisch korrekt festgelegt. Diese Linie hat bei mir funktioniert

navigationController?.navigationBar.topItem?.title = "Title"
Joel
quelle
2

Dies funktioniert für 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.

Saeed Ir
quelle
1

Versuchen Sie dies ... es wird funktionieren ...

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    self.title = ""
}

Der obige Code blendet den Text aus und zeigt nur den Zurückpfeil in der Navigationsleiste an.

Sarabjit Singh
quelle
0

self.title = "" Vorher einstellen self.navigationController?.pushViewController(vc, animated: true).

米米米
quelle
0
override func viewWillAppear(_ animated: Bool) {

    self.tabBarController?.navigationItem.title = "Notes"

    let sendButton = UIBarButtonItem(title: "New", style: .plain, target: self, action: #selector(goToNoteEditorViewController))

    self.tabBarController?.navigationItem.rightBarButtonItem = sendButton
}

func goToNoteEditorViewController(){
   // action what you want
}

Ich hoffe es hilft!! #swift 3

Sathish Kumar Gurunathan
quelle
0

Wenn Sie einen View Controller von der Seite des Page View Controllers verschieben, können Sie den Titel der Zurück-Schaltfläche des Navigationscontrollers nicht aktualisieren. Um dies zu lösen, erstellen Sie einen Delegaten zurück zu Ihrem übergeordneten Ansichtscontroller (möglicherweise können Sie auch die Ansichtscontrollerhierarchie zurück zum übergeordneten Ansichtscontroller durchlaufen).

Darüber hinaus haben Zurück-Schaltflächen eine Zeichenbeschränkung. Wenn Sie diese Zeichenbegrenzung überschreiten, wird das System standardmäßig auf "Zurück" gesetzt. Es wird für Sie nicht abschneiden. Beispielsweise:

backItem.title = "Birthdays/Anniversaries" // Get's converted to "Back".
backItem.title = "Birthdays/Anniversa…" // Fits and shows as is.
Justin Domnitz
quelle
0

Swift 4

In meinem Fall bestand die Lösung darin, das Navigationselement des Master View Controllers zu löschen, bevor Sie zum Child View Controller wechseln. Und stellen Sie es erneut ein, wenn es erneut angezeigt wird

MasterController

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

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

Und so drücke ich einen UIViewController und lösche das Element der hinteren Leiste im untergeordneten Controller:

MasterController

let childController = ChildController(collectionViewLayout: UICollectionViewFlowLayout())
childController.navigationItem.backBarButtonItem?.title = ""
navigationController?.pushViewController(childController, animated: true)
Jorge Casariego
quelle
0

für Swift 4.2

let backItem = UIBarButtonItem()
backItem.title = ""
navigationItem.backBarButtonItem = backItem
Iryna Batvina
quelle
0

GOTCHA: Wenn Sie Probleme mit einem der mit vielen Sternen ausgezeichneten Vorschläge haben, stellen Sie sicher, dass Sie Ihre UITableViewCells registrieren viewDidLoad(), nicht voninit()

Womble
quelle
-1

Lösung überprüft und in Swift 5 arbeiten

Im Folgenden habe ich einige Lösungen für verschiedene Fälle aufgeführt:

1. Entfernen Sie den Text von der Zurück-Schaltfläche

Die beste Lösung zum Entfernen von Text von der Zurück-Schaltfläche ist das Hinzufügen von viewDidLoad ():

navigationItem.backBarButtonItem = UIBarButtonItem()

2. Legen Sie den eigenen Text auf der Zurück-Schaltfläche fest

Wenn Sie Ihren eigenen Titel festlegen möchten, legen Sie den Titel von backButton fest:

let backButton = UIBarButtonItem()
backButton.title = "My Title"
navigationItem.backBarButtonItem = backItem

3. Leeren Sie die Zurück-Taste auf allen VC

Wenn Sie einen gemeinsamen Stil in der gesamten App erstellen möchten, um nur einen Pfeil ohne Text zurück zu haben, erstellen Sie eine Basis-VC für alle Ihre View Controller:

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

        navigationItem.backBarButtonItem = UIBarButtonItem()
    }
}

Mit der oben vorgestellten Lösung können Sie die Zurück-Schaltfläche in Zukunft anpassen, wenn Sie später eine Ausnahme machen möchten, indem Sie eine zusätzliche Variable hinzufügen und diese in einem bestimmten ViewController überschreiben, z.

class BaseViewController: UIViewController {

    var customBackButtonTitle: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        var backButton = UIBarButtonItem()
        if let text = customBackButtonTitle {
            backButton.title = text
        }
        navigationItem.backBarButtonItem = backButton
    }
}
lukszar
quelle
-2

schnell 4

Es gibt eine Möglichkeit, Text in backButton programmgesteuert vom aktuellen viewController aus zu ändern:

navigationController?.navigationBar.items![0].title = "some new text"
zslavman
quelle