Jak zmienić tytuł przycisku „wstecz” na pasku nawigacyjnym

224

Obecnie wartością domyślną lewego przycisku paska jest tytuł widoku, który załadował bieżący, innymi słowy widok, który ma być wyświetlany po naciśnięciu przycisku (przycisk Wstecz).

Chcę zmienić tekst wyświetlany na przycisku na inny.

Próbowałem umieścić następujący wiersz kodu w metodzie viewDidLoad kontrolera widoku, ale wydaje się, że nie działa.

self.navigationItem.leftBarButtonItem.title = @"Log Out";

Co powinienem zrobić?

Dzięki.

Dołek
źródło

Odpowiedzi:

345

Należy to umieścić w metodzie wywołującej ViewController zatytułowanej „NewTitle”. Tuż przed instrukcją push lub popViewController.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
Jordania
źródło
47
W kontrolerze widoku potomnego wywołanie tego z kontrolera widoku potomnego nie będzie działać. Musisz to wywołać z nadrzędnego kontrolera widoku, podczas gdy w kontrolerze podrzędnym.
Alex Reynolds,
2
Aby zmienić przycisk Wstecz dla mojego kontrolera widoku trzeciego poziomu (drugie naciśnięcie) musiałem użyć następującego wiersza zamiast powyższej odpowiedzi: [[self.parentViewController navigationItem] setBackBarButtonItem: newBackButton]; czy robię coś źle?
JonB
4
Jordan mówi, że „[dodał] nieco więcej jasności co do tego, gdzie umieścić kod”. Oto jeszcze większa przejrzystość: umieść go w pierwszym kontrolerze (zwanym także nadrzędnym), bezpośrednio przed wywołaniem, aby przełączyć drugi kontroler (zwany także dzieckiem).
benvolioT
1
możesz utworzyć niestandardowy sterownik BaseViewController i umieścić go w-viewDidLoad:
ArtFeel
2
Nie musisz tego robić tuż przed wypchnięciem lub popem. Możesz to zrobić w viewDidLoad lub loadView lub gdziekolwiek indziej ustawiasz tytuł i inne właściwości dla tego widoku. Poniższa odpowiedź Victora Bogdana jest jaśniejsza, IMHO.
Joe Strout,
98

W ChildVC to zadziałało dla mnie ...

self.navigationController.navigationBar.topItem.title = @"Back";

Działa również w Swift!

self.navigationController!.navigationBar.topItem!.title = "Back"
Piotruś Pan
źródło
4
Testowane i zweryfikowane na iOS 7 w Xcode 5.0.2. To spowoduje zmianę tytułu poprzedniego ekranu na Wstecz, gdy do niego wrócisz.
Alex Zavatone
Najprostsze rozwiązanie. Działa zarówno na iOS 6, jak i 7. Umieść w podstawowym UIViewController i gotowe. Znacznie lepsze niż rozwiązanie IB lub ustawienie w pushing vc.
Eric Chen
46
zmienia tytuł poprzedniego kontrolera widoku, to jest problem w tym rozwiązaniu
Nikita
2
@Nikita, Możesz ponownie wyświetlić kafelekWillDisappear
Dan Beaulieu
81

Oto dokumentacja backBarButtonItem :

„Gdy ten element nawigacyjny znajduje się bezpośrednio poniżej najwyższego elementu na stosie, kontroler nawigacyjny wyprowadza przycisk Wstecz dla paska nawigacji z tego elementu nawigacyjnego. [...] Jeśli chcesz określić niestandardowy obraz lub tytuł dla przycisku Wstecz , możesz przypisać niestandardowy element przycisku paska (z niestandardowym tytułem lub obrazem) do tej właściwości. ”

Wyświetl kontroler A ( „nadrzędny” kontroler widoku):

self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

Kiedy dowolny inny kontroler widoku B znajduje się na górze stosu nawigacji, a A znajduje się tuż pod nim, przycisk powrotu B będzie miał tytuł „Krótki” .

Victor Bogdan
źródło
4
trudną częścią jest to, że musisz ustawić przycisk Wstecz w kontrolerze widoku RODZIC, a nie w widoku potomnym. Zmarnowałem godzinę, właśnie to rozgryzłem.
Merkurial
56

w Xcode 4.5 za pomocą scenorysu zdecydowanie najprostszym rozwiązaniem, jakie znalazłem, gdy wartość przycisku Wstecz nie musi się dynamicznie zmieniać, to użycie pola „Przycisk Wstecz” powiązanego z elementem nawigacyjnym kontrolera widoku, do którego chcę, aby przycisk „Wstecz” powiedział coś innego.

np. na zrzucie ekranu poniżej, chcę przycisk Wstecz dla kontrolerów widoków, które naciskam, aby mieć tytuł „Wstecz” jako tytuł przycisku Wstecz.

wprowadź opis zdjęcia tutaj

oczywiście to nie zadziała, jeśli za każdym razem będziesz potrzebować przycisku Wstecz, aby za każdym razem mówić coś nieco innego… istnieją tutaj inne rozwiązania.

jan.k.doe
źródło
Oryginalne pytanie nie mówiło nic o używaniu scenariuszy, więc zdecydowanie dobrze, że nie jest to akceptowana odpowiedź, jednak poprawne rozwiązanie dotyczy rozwoju opartego na scenorysach.
villapossu
42

Wiem, że pytanie jest bardzo stare, ale znalazłem dobre rozwiązanie.

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

Działa z childView! Testowane z iOS 7.

seniorbenelli
źródło
To wydaje się działać tylko na jeden poziom. Dla mnie to nie działa na dziecko. iOS 8.
narco
26

Być może jestem zbyt uproszczony, ale z dokumentacji Apple brzmi:

Jeśli niestandardowy przycisk paska nie jest określony przez żaden z kontrolerów widoku, używany jest domyślny przycisk Wstecz, a jego tytuł jest ustawiany na wartość właściwości title poprzedniego kontrolera widoku - to znaczy kontrolera widoku o jeden poziom niżej stos.

Rozwiązanie oznaczone powyżej jako poprawne ustawia domyślny element przycisku nadrzędnego kontrolera. To właściwa odpowiedź, ale rozwiązuję problem, zmieniając self.titlewłaściwość UIViewController tuż przed wypchnięciem nowego kontrolera na stos Nawigacji.

To automatycznie aktualizuje tytuł przycisku Wstecz na następnym kontrolerze i dopóki nie self.titlewrócisz do tego, co powinno być viewWillAppear, nie widzę, aby ta metoda powodowała zbyt wiele problemów.

Jessedc
źródło
19

To działa dla mnie lepiej. Próbować :

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
Felipe FMMobile
źródło
19

W Swift / iOS8 działało dla mnie:

let backButton = UIBarButtonItem(
      title: "Back Button Text",
      style: UIBarButtonItemStyle.Bordered,
      target: nil,
      action: nil
);

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

Przeniesiony z odpowiedzi Felipe.

Duncan Smith
źródło
Składnia swift 1.1 toself.navigationController?.navigationBar.topItem?.backBarButtonItem
Warren Burton
3
Styl powinien brzmieć: UIBarButtonItemStyle.Plain
Micro
2
Dzięki za to. To naprawdę żałosne API. I ogólnie przedstawiciel UIKit. Pomiędzy paskami nawigacyjnymi a paskami stanu w iOS cudem jest to, że wciąż rozwijamy tę cholerną platformę. Dziękujemy Baby Jesus za przepełnienie stosu i jego autorów!
Womble
@Wobmle: Powinieneś programować na Androida przez kilka miesięcy;)
fl034
17

Ok, oto jest droga. Jeśli masz kontroler widoku „pierwszy” i poruszasz się po innym kontrolerze widoku „drugi”, naciskając przycisk itp., Musisz wykonać trochę pracy. Najpierw musisz utworzyć BarButtonItem w metodzie ViewDidLoad kontrolera „drugiego” widoku w ten sposób;

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

Po wykonaniu tej czynności musisz napisać w kodzie dla akcji „btnBack” w tym samym pliku .m;

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}

To wszystko.

EEE
źródło
2
A leftBarButtonItemnie ma wyglądu a backBarButtonItem, jeśli jest to ważne w projekcie aplikacji.
Alex Reynolds,
1
Spośród opublikowanych rozwiązań (bardzo dziękuję) ten wydaje się działać, chociaż jak wspomniano powyżej Alex, lewy przycisk paska nie wygląda jak element paska tylnego. Jak mogę sprawić, że będzie wyglądał jak element paska tylnego ???
Dale
17

Miałem nadrzędny kontroler widoku o naprawdę długim tytule. Spowodowało to krwawienie tekstu przycisku wstecz do tytułu kontrolera widoku potomnego.

Po wypróbowaniu wielu różnych rozwiązań, właśnie to skończyłem (rozwijając podejście @ john.k.doe):

Korzystanie z Xcode 7.2, Swift 2

  1. W serii ujęć, dodać Navigation Itemdo dominującej View Controller sceny (nie dziecko VC)

element nawigacyjny

  1. Na Attributes Inspectorswoim nowym Navigation Itemwpisz spaceznak w Back Buttonpolu. Więcej na ten temat później.

element nawigacyjny w widoku Hierarchia

dodaj spację do pola Przycisk Wstecz

  1. W kontrolerze widoku rodzica dodaj następujący kod:

skrawek:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
    case is ChildViewController:
        navigationItem.backBarButtonItem?.title = ""
    default:
        navigationItem.backBarButtonItem?.title = "Full Parent Title"
    }
}

Wyjaśnienie:

Rodzaj przycisku Wstecz należy do nadrzędnego kontrolera widoku. Navigation ItemDaje dojście do przycisku tyłu, dzięki czemu można ustawić tytuł w kodzie lub w serii ujęć.

Uwaga:

Jeśli pozostawisz Navigation Item Back Buttontekst jako domyślny pusty ciąg, tytuł przycisku Wstecz zmieni się na „Wstecz”.

Inne podejścia działają, po co korzystać z tego ?:

Chociaż można zastąpić tytuł przycisku Wstecz na kontrolerze widoku potomnego, trudno było go uchwycić, dopóki nie błysnął krótko na ekranie.

Niektóre podejścia konstruują nowy przycisk Wstecz i zastępują istniejący. Jestem pewien, że to działa i prawdopodobnie konieczne w niektórych przypadkach użycia. Ale wolę wykorzystać istniejące interfejsy API, jeśli to możliwe.

Zmiana titlenadrzędnego kontrolera widoku jest najszybszym rozwiązaniem w niektórych sytuacjach. Zmienia to jednak tytuł nadrzędny, więc musisz zarządzać stanem. Sprawy również stają się Tab Bar Controllernieporządne, ponieważ zmiany tytułów powodują skutki uboczne związane z Tab Bar Itemtytułami.

Robert Chen
źródło
10

Dla tych, którzy używają scenorysów, po prostu wybierz macierzystą (nie tą, która trzyma widok docelowy) ramkę kontrolera widoku (pamiętaj, aby kliknąć prawym przyciskiem myszy pasek nawigacji, a następnie otworzyć inspektora atrybutów, w którym znajdziesz trzy dane wejściowe formularza. Trzeci „ przycisk Wstecz ”to to, czego szukamy.

pedrouan
źródło
4
jest to najlepsze rozwiązanie, jeśli nie zależy Ci na lokalizacji.
MiQUEL
7

Wersja szybka:

W twoim dziecku ViewController:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}
buxik
źródło
to faktycznie zmieni tytuł kontrolera widoku poprzedniego na stosie na „TEKST”, co jest mniej niż idealne.
gravitron
6

Oto inny sposób, aby to zrobić.

W nadrzędnym kontrolerze widoku zaimplementuj następującą metodę:

- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
  self.navigationItem.backBarButtonItem.title = newTitle;
}

W kontrolerze widoku dziecka zmiana tytułu będzie działać:

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

Nigdy nie udało mi się uruchomić parentViewControllernieruchomości:

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];

Nie wiem, czy to błąd, czy nie używam go poprawnie. Ale przechwytywanie przedostatniego kontrolera widoku w viewControllerstablicy wskazuje na nadrzędny kontroler widoku i mogę poprawnie wywoływać metody nadrzędne za pomocą tego odwołania.

Alex Reynolds
źródło
6

dobrze. Osobiście nienawidziłem tych wszystkich opcji. Dlatego wymyśliłem własne.

Na podstawie informacji, które widziałem. Wygląda na to, że poprzedni kontroler widoku kontroluje własny przycisk „Wstecz”, który będzie prezentowany na kontrolerze wypychanym.

W kontrolerze utworzyłem metodę Lazy Load dla elementu nawigacji, który chce zmienić przycisk Wstecz.

Mój jest kontrolerem zaproś kupującego

Zaproś kupującego to tekst ustawiony domyślnie.

ale przycisk Wstecz musiał być Zaproś

Oto kod, którego użyłem do utworzenia przycisku Wstecz.

Umieściłem ten kod w górnej części pliku Implementatora kontrolera (.m) i automatycznie zastąpił on metodę super.

- (UINavigationItem *)navigationItem{
    UINavigationItem *item = [super navigationItem];
    if (item != nil && item.backBarButtonItem == nil)
    {
        item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
        item.backBarButtonItem.title = @"Invite";
    }

    return item;
}

Myślę, że jest to o wiele bardziej elegancki sposób na osiągnięcie tego.

Umieszczam ten kod w jednym miejscu i automatycznie zapełnia się w razie potrzeby.

Nie ma potrzeby wywoływania kodu przed każdym żądaniem push.

Mam nadzieję że to pomoże

Lazy Coder
źródło
5
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];
Gopikryszna
źródło
5

Oto odpowiedź:

W viewDidAppear:animated(NIE w viewDidLoad) wykonaj następujące czynności

- (void)viewDidAppear:(BOOL)animated
{
     [self.navigationController.navigationBar.backItem setTitle:@"anything"];

     // then call the super
     [super viewDidAppear:animated];
}

Że jeśli chcesz zachować kształt przycisku wstecz.

Basheer_CAD
źródło
Nieźle, z wyjątkiem tego, że widzą, jak zmienia tytuły. Próbowałem w widoku WillAppear i to nie działa.
Travis M.
5

Żadne z opisanych tutaj rozwiązań nie działało dla mnie. Więc to, co zrobiłem, to usunięcie tytułu ze sceny, z której pochodzę, w następujący sposób:

self.title = @"";

Tak więc kiedy prezentowana jest nowa scena, tekst nie pojawia się.

Absolutnie zgadzam się, że nie jest to wcale jasne rozwiązanie, ale zadziałało i żadne wyjaśnienie nie działało dla mnie.

Javier Calatrava Llavería
źródło
Człowieku, muszę ci powiedzieć, że jest rok 2017 i wciąż jest ból w $$, żeby poradzić sobie z przyciskiem Wstecz. Twoja metoda zadziałała dla mnie i skończyłem ze znakiem „<”, chociaż chciałem słowa „Anuluj”, ale zadowolę się tym, co dostałem. :)
AnBisw
5

Przekonałem się, że najlepiej jest zmienić tytuł bieżącego kontrolera widoku w stosie nawigacji na pożądany tekst przycisku Wstecz przed przejściem do następnego kontrolera widoku.

Na przykład

self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];

Następnie w viewDidAppear ustaw tytuł z powrotem na żądany tytuł dla oryginalnej VC. Voila!

OneInABajilian
źródło
5

Dla Swift:

    // Rename back button
    let backButton = UIBarButtonItem(
        title: "Back",
        style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
        target: nil,
        action: nil
    )
    self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton
Ryan R.
źródło
4

Przekonałem się, że najłatwiejszym sposobem zmiany nazwy przycisku Wstecz jest ustawienie tytułu kontrolerów widoku na tytuł przycisku Wstecz, a następnie zamiana titleView w elemencie nawigacyjnym kontrolerów widoku na niestandardową etykietę z rzeczywistą etykietą imię.

Lubię to:

CustomViewController.m

@implementation CustomViewController

- (NSString*)title {
    return @"Back Button Title";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
    customTitleView.text = @"Navigation Bar Title";
    customTitleView.font = [UIFont boldSystemFontOfSize:20];
    customTitleView.backgroundColor = [UIColor clearColor];
    customTitleView.textColor = [UIColor whiteColor];
    customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    customTitleView.shadowOffset = CGSizeMake(0, -1);

    [customTitleView sizeToFit];

    self.navigationItem.titleView = [customTitleView autorelease];
}

@end

To sprawi, że twój tytuł w UINavigationBar będzie wyglądał, jakby był rodzimy. Umożliwiając kontrolerowi widoku oddzielny tytuł i tytuł przycisku wstecz.

W przypadku kontrolera widoku A i B, A odpowiada za określenie, jak powinien wyglądać jego przycisk powrotu, podczas gdy wyświetla się B.

EDYCJA: Zachowuje to także natywny wygląd przycisku Wstecz (element przycisku strzałki w lewo).

Trenskow
źródło
4

Ten kod też działa. Umieść to na kontrolerze głównym kontrolera nawigacji:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
użytkownik2666203
źródło
4

Jestem nowy w iOS, ale podam moją bardzo prostą odpowiedź na przesłonięcie klasy kontrolera nawigacji. Mam proste zastąpienie metod push i pop i zapisuję tytuł poprzedniego kontrolera widoku. Przepraszamy za wklejenie w bloku js. Nie byłem trochę zdezorientowany, jak to wkleić w normalnym bloku kodu.

#import "MyCustomNavController.h"


@implementation MyCustomNavController {

    NSString *_savedTitle;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
    _savedTitle = self.topViewController.title;

    self.topViewController.title = title;
    [super pushViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {

    [self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
    return [super popViewControllerAnimated:animated];
}

@end

Siergiej Brazhnik
źródło
4

self.navigationController.navigationBar.backItem.title = @"TEXT";

A w Swift:

self.navigationController?.navigationBar.backItem?.title = "TEXT"
GS
źródło
3
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

możesz umieścić go gdziekolwiek chcesz w kodzie w kontrolerze bieżącym, co pozwala mieć różne przyciski wsteczne dla różnych widoków potomnych.

Chikuba
źródło
3

Większość rozwiązań zabija oryginalny styl BackButton (lewy przycisk paska ze strzałką), jednocześnie dodając zwykły przycisk z żądanym tytułem.
Aby zachować oryginalny styl, istnieją 2 sposoby:
1. Aby użyć nieudokumentowanego stylu przycisków (110 lub coś w tym stylu), czego wolę nie robić. Ale jeśli chcesz, możesz dowiedzieć się, jak to zrobić tutaj, na stackoverflow.
2.: Wykorzystanie idei Trenskowa. Podobało mi się i używam go nieco zmienionego.
Zamiast nadpisywania - (NSString *) tytułu postanowiłem zachować oryginalny tytuł w następujący sposób (co pozwala mi korzystać z tytułów stalówki, a także z tytułu nadanego w stanie push btw).

- (void)viewDidLoad {
    [super viewDidLoad];
    static NSString * backButtonTitle=@"Back"; //or whatever u want

    if (![self.title isEqualToString:backButtonTitle]){

        UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
        customTitleView.text = self.title; // original title
        customTitleView.font = [UIFont boldSystemFontOfSize:20];
        customTitleView.backgroundColor = [UIColor clearColor];
        customTitleView.textColor = [UIColor whiteColor];
        customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
        customTitleView.shadowOffset = CGSizeMake(0, -1);

        [customTitleView sizeToFit];

        self.navigationItem.titleView = [customTitleView autorelease];
        self.title = backButtonTitle; 
    }
}

To rozwiązanie działa dobrze i wygląda na natywne. Również użycie go w metodzie viewDidLoad zapobiega wykonaniu więcej niż 1 raz.
Próbowałem też rozwiązania Jessedca, ale źle to wygląda. Powoduje to widoczną zmianę paska tytułu użytkownika w locie z oryginału na pożądany przycisk BackButton iz powrotem.

Stan
źródło
2

Działa to dla mnie jako „uproszczona” wersja wcześniej opublikowanych odpowiedzi.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

Pamiętaj, aby wstawić kod do nadrzędnego kontrolera widoku (np. Widok zawierający widok tabeli lub UITableViewController), a nie widok potomny lub szczegółowy (np. UIViewController).

Możesz łatwo zlokalizować ciąg przycisku Wstecz w następujący sposób:

backButton.title = NSLocalizedString(@"Back Title", nil);
Lex L.
źródło
2

Mamy dwa VC A i B.

Jeśli chcesz zmienić tytuł w B, wpisz ten kod w A

- (IBAction)goToBViewController:(UIButton *)sender {

    BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:nil
                                                                 action:nil];
    [[self navigationItem] setBackBarButtonItem:newBackButton];
    [self.navigationController pushViewController:vc animated:NO];

}

Swift 4.1 Xcode 9.4

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)
iOS
źródło
1

Odpowiedź Stana była najlepsza. Ale ma również problem, gdy używasz kontrolera z paskiem kart i zmieniasz tytuł kontrolera, możesz także zmienić tytuł paska kart. Najlepszą odpowiedzią jest zmiana tylko view_controller.navigationItem.title i użycie view_controller.navigationItem .title w funkcji. Odpowiedź jest tutaj: (za pomocą ARC i dodaj je do widoku viewDidLoad)

  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }

W moim użyciu, robię to taką funkcję, po prostu mam funkcję z jednym kodem linii w viewDidLoad.

+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }
}
jtianling
źródło
1

Jeśli chcesz nie tylko zmienić tekst przycisku Wstecz na ten sam tekst i zachować oryginalny kształt lewej strzałki, ale także zrobić coś, gdy użytkownik kliknie przycisk Wstecz, polecam rozejrzeć się po moim „ CustomNavigationController ” .

jianpx
źródło
1

PROBLEM: Nie można zastąpić tekstu „Wstecz” na pasku nawigacyjnym.

POWÓD: Etykieta „Wstecz” jest ustawiana na pasku nawigacyjnym po wypchnięciu widoku, ponieważ atrybut .title w nadrzędnym kontrolerze widoku został ustawiony na zero (lub nie został zainicjowany).

JEDNO ROZWIĄZANIE: Jeśli ustawisz self.title = „Cokolwiek ...” zobaczysz, że zamiast „Wstecz” pojawi się „Cokolwiek ...” po naciśnięciu nowego kontrolera widoku.

Javier Calatrava Llavería
źródło