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

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)

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


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.


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

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


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


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)

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.


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)

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.


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"

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


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

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)

    }

}

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"

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


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.


0

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


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


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.

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)

0

dla Swift 4.2

let backItem = UIBarButtonItem()
backItem.title = ""
navigationItem.backBarButtonItem = backItem

0

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


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

-2

szybki 4

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

navigationController?.navigationBar.items![0].title = "some new text"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.