Jak ustawić tekst przycisku wstecz w Swift

207

Jak usunąć tekst przycisku Wstecz.

Aktualny przycisk powrotu:

<Wróć

Żądany przycisk powrotu:

<AnythingElse

Żaden z nich nie działał:

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
źródło

Odpowiedzi:

604

Przycisk Wstecz należy do poprzedniego kontrolera widoku, a nie do tego, który jest obecnie wyświetlany na ekranie.
Aby zmodyfikować przycisk Wstecz, należy go zaktualizować przed naciśnięciem na kontrolerze widoku, który zainicjował segue:

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

LUB

// in your viewDidLoad or viewWillAppear
navigationItem.backBarButtonItem = UIBarButtonItem(
    title: "Something Else", style: .plain, target: nil, action: nil)
Yariv Nissim
źródło
9
Wielkie dzięki, nie wiesz, ile godzin spędzam tylko na ten drobny szczegół (poprzedni kontroler)
Ricardo
3
Gdybym mógł głosować milion razy, zrobiłbym to. Nie mogę powiedzieć, jak długo spędziłem zastanawiając się, dlaczego to nie działa (poprzednio na kontrolerze docelowym)
Dylan Irlandia
13
„Przycisk Wstecz należy do poprzedniego kontrolera widoku” to najcenniejsza odpowiedź, jaką znalazłem na ten temat! Dziękuję Ci!
vhristoskov
1
Ustawienie titlezmian zmienia tytuł , a nie tylko przycisk Wstecz.
Yariv Nissim,
4
Dodałem self.navigationController! .NavigationBar.topItem! .BackBarButtonItem = backItem zamiast navigationItem.backBarButtonItem = backItem i działa dobrze na Swift 3. Dziękuję
Indra Adam
125

Możesz to zrobić w Konstruktorze interfejsów w następujący sposób:

kliknij element nawigacyjny poprzedniego kontrolera widoku

wprowadź opis zdjęcia tutaj

z poziomu inspektora atrybutów ustaw tekst przycisku Wstecz na dowolne. Otóż ​​to!!

wprowadź opis zdjęcia tutaj

Ajinkya Patil
źródło
1
jaki jest najlepszy sposób przypisania „zero”?
kennydust
@kennydust Czy masz na myśli pusty tytuł?
Ajinkya Patil,
8
@kennydust tak w przycisku Wstecz dodaj spację i naciśnij enter
Ajinkya Patil
Ładne i łatwe, ale czy można je zlokalizować?
Gruntcakes
2
@AjinkyaPatil Próbowałem tego, ale przycisk Wstecz nie wyświetla się. Jest jakiś powód, dla którego to może być?
user805981
48

Tekst przycisku Wstecz jest pobierany z tytułu elementu nawigacyjnego nadrzędnego kontrolera widoku. Zatem cokolwiek ustawisz w tytule elementu nawigacyjnego poprzedniego kontrolera widoku, będzie wyświetlane na tekście przycisku wstecz kontrolera bieżącego widoku. Możesz po prostu wpisać „” jako tytuł elementu nawigacji w metodzie viewWillAppear nadrzędnego kontrolera widoku.

self.navigationItem.title = ""

Innym sposobem jest umieszczenie

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

w bieżącym widoku kontrolera metoda viewWillAppear. Ten spowoduje inny problem, jeśli stos nawigacyjny jest zbyt zagnieżdżony.

minhazur
źródło
5
self.navigationItem.title = "" powinien być na górze jako najlepsza odpowiedź!
rilar,
Zgadzam się z tym, ponieważ najlepsza odpowiedź, ponieważ wszystkie powyższe odpowiedzi wymagają dodania funkcji docelowej do elementu nawigacyjnego, więc nie tylko zmieniają tekst, ale także dodają niestandardową funkcję pop, która nie jest wymagana przez pytanie!
IsPha
Działa to dobrze prepareForSegue, to znaczy. trochę czystsze, ponieważ nie zmieniasz nowego viewController po załadowaniu.
Adrian
Zwróć uwagę!!! wstaw self.title = "....." przed wywołaniem self.navigationItem.title = ""
Bary Levy
45

Możesz umieścić 3 wiersze kodu w polu, wViewController którym chcesz zmienić tytuł przycisku wstecz.

W twoim override func viewDidLoad() {}.

let backButton = UIBarButtonItem()
backButton.title = "My Back Button Title"
self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
Hitesh Chauhan
źródło
2
To rozwiązanie wydaje się bardziej poprawne, ponieważ umieszczasz logikę w nadchodzącym VC, a nie w VC, który opuszczasz. Aka: czyta lepiej.
eonista
37

Jeśli używasz pliku xib do kontrolera widoku, zrób to w klasie kontrolera widoku.

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
}

}

Wynik będzie:

wprowadź opis zdjęcia tutaj

Mustaq
źródło
29

Nie wiem, gdzie użyłeś swoich metod, które postawiłeś na swoje pytanie, ale mógłbym uzyskać pożądany wynik, jeśli użyję w mojej ViewControllerklasie (w której chcę zmienić przycisk Wstecz), w viewDidLoad()funkcji, następujący wiersz:

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

Wynik będzie:

Przed

wprowadź opis zdjęcia tutaj

Po

wprowadź opis zdjęcia tutaj

Francisco Romero
źródło
3
W moim przypadku zadziałało to tylko wtedy, gdy umieścisz ten fragment kodu w metodzie viewDidAppear, a nie w
viewDidLoad
2
Użyj navigationController.navigationBar.topItem?.title = ""zamiast tego, aby uniknąć włożenia tegoviewDidAppear
José
Wydaje się to najbardziej satysfakcjonującym sposobem i pozwala uniknąć flashowania, ponieważ tytuł przycisku wstecz jest zmieniany na „” za pomocą self.navigationItem.title = "” w kontrolerze wywołującym (wolniejsze urządzenia). Również inna sytuacja, w której self.navigationItem.title = "" jest całkowicie ignorowana, sporadycznie przechodząc szybko do kontrolera widoku za pomocą programowego przełączania tabulatorów tabulatorów.
FlimFlam Vir
22

Przycisk Wstecz należy do poprzedniego kontrolera widoku, a nie do tego, który jest obecnie wyświetlany na ekranie. Aby zmodyfikować przycisk Wstecz, powinieneś go zaktualizować przed wypchnięciem, dodaj viewdidload:

Swift 4:

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)
Mohammad Razipour
źródło
12

Możesz po prostu zmodyfikować NavigationItem w serii ujęć

wprowadź opis zdjęcia tutaj

W przycisku Wstecz dodaj spację i naciśnij klawisz Enter.

Uwaga: Zrób to w poprzednim VC.

Xhinoda
źródło
8

Swift 4 - Skonfiguruj przycisk Wstecz przed naciśnięciem dowolnego kontrolera widoku

// 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
źródło
8

To powinno działać:

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

Chociaż nie jest to zalecane, ponieważ faktycznie zastępuje przycisk BackButton, a także usuwa strzałkę wstecz i gest machnięcia.

Dejan Skledar
źródło
10
nie jest to właściwy sposób, po prostu zastępujesz przycisk Wstecz
Yariv Nissim
Lepiej to zrobić z poziomu konstruktora interfejsu
Rutger Huijsmans
7

Szybki 4.2

Jeśli chcesz zmienić tekst elementu przycisku wstecz paska nawigacji, umieść go w viewDidLoadkontrolerze PRZED tym, w którym wyświetla się przycisk powrotu, NIE na kontrolerze widoku, w którym widoczny jest przycisk powrotu.

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

Jeśli chcesz zmienić bieżący tekst tytułu paska nawigacji, użyj poniższego kodu (zwróć uwagę, że staje się to domyślnym tekstem tylnym dla widoku NASTĘPNY wypchnięty na kontroler nawigacji, ale ten domyślny tekst wsteczny można zastąpić powyższym kodem)

 self.title = "Navigation Bar Title"
ikbal
źródło
6

Istnieją dwa sposoby.

1. w poprzednimViewContConterer.viewDidLoad ()

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

2. w currentViewController.viewDidAppear ()

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

Powód: backButtonpochodzi navigationBar.backItem.backBarButtonItem, więc pierwszy sposób jest obvious.In currentViewController.viewDidLoad (), nie możemy uzyskać referencję backItem, ponieważ w viewDidAppear (), przy czym navigationBarpchnął navigationViewna ITS stack.so możemy wprowadzać zmiany do backItemw currentViewController. viewDidAppear ()

Aby uzyskać więcej informacji, możesz zobaczyć Dokument: UINavigationBar

Calcifer
źródło
3

W viewDidLoadmetodzie prezentacji kontrolera dodaj:

// hide navigation bar title in the next controller
let backButton = UIBarButtonItem(title: "", style:.Plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backButton
Mikołaj
źródło
2

chociaż te odpowiedzi rozwiązują problem, ale może to być przydatne

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
źródło
2

Szybki 4

Podczas gdy poprzednie powiedzenie, aby przygotować się do segue, jest poprawne i prawda, że ​​przycisk Wstecz należy do poprzedniego VC, po prostu dodaje trochę więcej niepotrzebnego kodu.

Najlepiej jest ustawić tytuł bieżącego VC w viewDidLoad i automatycznie ustawi prawidłowy tytuł przycisku Wstecz na następnym VC. Ta linia działała dla mnie

navigationController?.navigationBar.topItem?.title = "Title"
Joel
źródło
2

Działa to dla Swift 5 :

self.navigationItem.backBarButtonItem?.title = ""

Pamiętaj, że będzie to skuteczne dla następnego kontrolera widoku wypychanego, a nie bieżącego na wyświetlaczu, dlatego jest to bardzo mylące!

Sprawdź także scenorys i wybierz element nawigacyjny poprzedniego kontrolera widoku, a następnie wpisz coś w przycisku Wstecz (Inspektor).

Saeed Ir
źródło
1

Spróbuj tego ... zadziała ....

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

Powyższy kod ukryje tekst i wyświetli tylko strzałkę wstecz na pasku nawigacyjnym.

Sarabjit Singh
źródło
0

Ustaw self.title = "" wcześniej self.navigationController?.pushViewController(vc, animated: true).

米米米
źródło
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
}

Mam nadzieję, że to pomoże!! #swift 3

Sathish Kumar Gurunathan
źródło
0

Jeśli przesuwasz kontroler widoku ze strony kontrolera widoku strony, nie możesz zaktualizować tytułu przycisku wstecz kontrolera nawigacji. Aby rozwiązać ten problem, utwórz delegata z powrotem do nadrzędnego kontrolera widoku (możesz również przejść do hierarchii kontrolera widoku z powrotem do nadrzędnego).

Ponadto przyciski Wstecz mają limit znaków. Jeśli przekroczysz ten limit znaków, domyślnym ustawieniem systemu będzie „Wstecz”. Nie obetnie cię. Na przykład:

backItem.title = "Birthdays/Anniversaries" // Get's converted to "Back".
backItem.title = "Birthdays/Anniversa…" // Fits and shows as is.
Justin Domnitz
źródło
0

Szybki 4

W moim przypadku rozwiązaniem było wyczyszczenie elementu nawigacyjnego Master View Controller przed przejściem do Child View Controller. I ustaw go ponownie, jeśli pojawi się ponownie

MasterController

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

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

I w ten sposób wciskam UIViewController i usuwam element przycisku paska tylnego w kontrolerze potomnym:

MasterController

let childController = ChildController(collectionViewLayout: UICollectionViewFlowLayout())
childController.navigationItem.backBarButtonItem?.title = ""
navigationController?.pushViewController(childController, animated: true)
Jorge Casariego
źródło
0

dla Swift 4.2

let backItem = UIBarButtonItem()
backItem.title = ""
navigationItem.backBarButtonItem = backItem
Iryna Batvina
źródło
0

GOTCHA: Jeśli masz problem z jedną z wielu gwiazdek, upewnij się, że rejestrujesz swoje, UITableViewCella viewDidLoad()nie zinit()

Womble
źródło
-1

Rozwiązanie sprawdzone i działa w Swift 5

Poniżej przedstawiam kilka rozwiązań dla różnych przypadków:

1. Usuń tekst z przycisku Wstecz

Najlepszym rozwiązaniem do usunięcia tekstu z przycisku Wstecz jest dodanie w viewDidLoad ():

navigationItem.backBarButtonItem = UIBarButtonItem()

2. Ustaw własny tekst na przycisku Wstecz

Jeśli chcesz ustawić własny tytuł, zrób to, ustawiając tytuł backButton:

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

3. Pusty przycisk powrotu na wszystkich VC

Jeśli chcesz stworzyć wspólny styl w całej aplikacji - aby mieć tylko strzałkę wstecz bez tekstu, utwórz podstawowy VC dla wszystkich kontrolerów widoku:

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

        navigationItem.backBarButtonItem = UIBarButtonItem()
    }
}

Rozwiązanie przedstawione powyżej pozwala dostosować przycisk Wstecz w przyszłości, jeśli chcesz zrobić jakiś wyjątek później, dodając dodatkową zmienną i zastępując ją w konkretnym ViewController, np .:

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
źródło
-2

szybki 4

istnieje jeden sposób programowej zmiany tekstu w backButton z bieżącego widokuController:

navigationController?.navigationBar.items![0].title = "some new text"
zslavman
źródło