Wie ändere ich den Titel der Schaltfläche "Zurück" in einer Navigationsleiste?

224

Derzeit ist der Standardwert für die Schaltfläche in der linken Leiste der Titel der Ansicht, in die die aktuelle geladen wurde, dh die Ansicht, die beim Drücken der Schaltfläche angezeigt werden soll (Zurück-Schaltfläche).

Ich möchte den auf der Schaltfläche angezeigten Text in etwas anderes ändern.

Ich habe versucht, die folgende Codezeile in die viewDidLoad-Methode des View Controllers einzufügen, aber es scheint nicht zu funktionieren.

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

Was soll ich machen?

Vielen Dank.

Tal
quelle

Antworten:

345

Dies sollte in die Methode eingefügt werden, die den ViewController mit dem Titel "NewTitle" aufruft. Direkt vor der push- oder popViewController-Anweisung.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
Jordanien
quelle
47
In der untergeordneten Ansichtssteuerung funktioniert das Aufrufen über die untergeordnete Ansichtssteuerung nicht. Sie müssen dies vom übergeordneten Ansichtscontroller aus aufrufen, während Sie sich im untergeordneten Ansichtscontroller befinden.
Alex Reynolds
2
Um die Zurück-Schaltfläche für meinen View Controller der dritten Ebene zu ändern (zweiter Druck), musste ich anstelle der obigen Antwort die folgende Zeile verwenden: [[self.parentViewController navigationItem] setBackBarButtonItem: newBackButton]; Mache ich etwas falsch?
JonB
4
Jordan sagt, er habe "etwas mehr Klarheit darüber hinzugefügt, wo der Code abgelegt werden soll". Hier ist noch mehr Klarheit: Legen Sie es in den ersten Controller (auch als übergeordneter Controller bezeichnet) unmittelbar vor dem Aufruf, um den zweiten Controller (auch als untergeordneter Controller bezeichnet) zu drücken.
BenvolioT
1
Sie können einen benutzerdefinierten BaseViewController erstellen und in-viewDidLoad:
ArtFeel
2
Sie müssen dies nicht direkt vor dem Push oder Pop tun. Sie können dies in viewDidLoad oder loadView tun oder wo immer Sie den Titel und andere Eigenschaften für diese Ansicht festlegen. Victor Bogdans Antwort unten ist klarer, IMHO.
Joe Strout
98

In ChildVC hat das bei mir funktioniert ...

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

Funktioniert auch in Swift!

self.navigationController!.navigationBar.topItem!.title = "Back"
Peter Pan
quelle
4
Getestet und verifiziert unter iOS 7 in Xcode 5.0.2. Dadurch wird der Titel des vorherigen Bildschirms in "Zurück" geändert, wenn Sie dorthin zurückkehren.
Alex Zavatone
Einfachste Lösung. Funktioniert sowohl unter iOS 6 als auch unter 7. Setzen Sie den Basis-UIViewController ein und fertig. Viel besser als die IB-Lösung oder Einstellung im Pushing-VC.
Eric Chen
46
es ändert den Titel des vorherigen View Controllers, das ist das Problem in dieser Lösung
Nikita
2
@ Nikita, Sie können die Kachel in viewWillDisappear
Dan Beaulieu
81

Hier ist die Dokumentation für backBarButtonItem :

"Wenn sich dieses Navigationselement unmittelbar unter dem obersten Element im Stapel befindet, leitet der Navigationscontroller die Zurück-Schaltfläche für die Navigationsleiste von diesem Navigationselement ab. [...] Wenn Sie ein benutzerdefiniertes Bild oder einen benutzerdefinierten Titel für die Zurück-Schaltfläche angeben möchten können Sie dieser Eigenschaft stattdessen ein benutzerdefiniertes Balkenschaltflächenelement (mit Ihrem benutzerdefinierten Titel oder Bild) zuweisen. "

View Controller A (der "übergeordnete" View Controller):

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

Befindet sich ein anderer Ansichts-Controller B oben auf dem Navigationsstapel und A direkt darunter, hat die Zurück-Schaltfläche von B den Titel "Kurz" .

Victor Bogdan
quelle
4
Der schwierige Teil ist, dass Sie die Zurück-Schaltfläche im PARENT-Ansichts-Controller und nicht in der untergeordneten Ansicht festlegen müssen. Eine Stunde verschwendet, nur um das herauszufinden.
Merkurial
56

In Xcode 4.5 mit Storyboard ist die bei weitem einfachste Lösung, die ich gefunden habe, wenn sich der Wert der Schaltfläche "Zurück" nicht dynamisch ändern muss, die Verwendung des Felds "Zurück", das dem Navigationselement des View Controllers zugeordnet ist, zu dem Sie gehören möchte, dass die Schaltfläche "Zurück" etwas anderes sagt.

Beispiel: Im folgenden Screenshot möchte ich, dass die Schaltfläche "Zurück" für die View-Controller, die ich drücke, "Zurück" als Titel der Schaltfläche "Zurück" hat.

Geben Sie hier die Bildbeschreibung ein

Dies funktioniert natürlich nicht, wenn Sie die Zurück-Taste benötigen, um jedes Mal etwas anderes zu sagen. Dafür gibt es hier alle anderen Lösungen.

john.k.doe
quelle
Die ursprüngliche Frage sagte nichts über die Verwendung von Storyboards aus, daher ist es auf jeden Fall gut, dass dies nicht die akzeptierte Antwort ist. Richtig ist jedoch eine Lösung für die Storyboard-basierte Entwicklung.
Villapossu
42

Ich weiß, die Frage ist sehr alt, aber ich habe eine schöne Lösung gefunden.

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

Funktioniert von childView! Getestet mit iOS 7.

Seniorbenelli
quelle
Dies scheint nur auf einer Ebene zu funktionieren. Es funktioniert nicht für ein Kind eines Kindes für mich. iOS 8.
Narco
26

Vielleicht bin ich zu simpel, aber aus Apples Dokumentation lautet der Wortlaut:

Wenn von keinem der Ansichts-Controller ein benutzerdefiniertes Balkenschaltflächenelement angegeben wird, wird eine Standard-Zurück-Schaltfläche verwendet und der Titel auf den Wert der title-Eigenschaft des vorherigen Ansichts-Controllers festgelegt, d. H. Der Ansichts-Controller eine Ebene tiefer der Stapel.

Die oben als korrekt gekennzeichnete Lösung legt ein Standardschaltflächenelement vom übergeordneten Controller fest. Es ist die richtige Antwort, aber ich self.titlelöse das Problem, indem ich die Eigenschaften des UIViewControllers ändere, bevor ich den neuen Controller auf den NavigationController-Stapel schiebe.

Dadurch wird der Titel der Zurück-Schaltfläche auf dem nächsten Controller automatisch aktualisiert. Solange Sie self.titleauf den gewünschten Wert zurücksetzen, viewWillAppearkann ich nicht sehen, dass diese Methode zu viele Probleme verursacht.

Jessedc
quelle
19

Das funktioniert besser für mich. Versuchen :

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
Felipe FMMobile
quelle
19

In Swift / iOS8 hat Folgendes für mich funktioniert:

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

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

Portiert aus Felipes Antwort.

Duncan Smith
quelle
schnelle 1.1 Syntax istself.navigationController?.navigationBar.topItem?.backBarButtonItem
Warren Burton
3
Stil sollte UIBarButtonItemStyle.Plain
Micro
2
Danke dafür. Was für eine wirklich erbärmliche API das ist. Und Vertreter von UIKit im Allgemeinen. Es ist ein Wunder, dass wir zwischen Navigationsleisten und Statusleisten in iOS immer noch für diese verdammte Plattform entwickeln. Vielen Dank, Baby Jesus, für Stack Overflow und seine Mitwirkenden!
Womble
@ Wobmle: Sie sollten für Android für ein paar Monate entwickeln;)
fl034
17

Ok, hier ist der Weg. Wenn Sie einen View Controller "first" haben und einen anderen View Controller "second" durch Drücken einer Taste usw. navigieren, müssen Sie einige Arbeiten ausführen. Zuerst müssen Sie ein BarButtonItem in der ViewDidLoad-Methode des "zweiten" View Controllers wie folgt erstellen.

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

Nachdem Sie dies getan haben, müssen Sie in den Code für die Aktion "btnBack" in dieselbe .m-Datei wie diese schreiben.

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

Das ist alles.

EEE
quelle
2
A leftBarButtonItemhat nicht das Aussehen von a backBarButtonItem, wenn dies für das Anwendungsdesign wichtig ist.
Alex Reynolds
1
Von den veröffentlichten Lösungen (vielen Dank) scheint diese zu funktionieren, obwohl, wie Alex oben sagte, die Schaltfläche in der linken Leiste nicht wie ein Element in der hinteren Leiste aussieht. Wie kann ich es wie einen Artikel in der hinteren Leiste aussehen lassen?
Dale
17

Ich hatte einen übergeordneten Ansichts-Controller mit einem sehr langen Titel. Dies führte dazu, dass der Text der Zurück-Schaltfläche in den Titel des untergeordneten Ansichts-Controllers blutete.

Nachdem ich eine Reihe verschiedener Lösungen ausprobiert hatte, habe ich Folgendes getan (Erweiterung des @ john.k.doe-Ansatzes):

Verwenden von Xcode 7.2, Swift 2

  1. Fügen Sie im Storyboard Navigation Itemder übergeordneten View Controller-Szene eine hinzu (nicht die untergeordnete VC).

Navigationselement

  1. Geben Sie Attributes Inspectorauf Ihrem neuen Feld Navigation Itemein spaceZeichen ein Back Button. Dazu später mehr.

Navigationselement in Ansichtshierarchie

Fügen Sie dem Feld "Zurück" ein Leerzeichen hinzu

  1. Fügen Sie im Controller der übergeordneten Ansicht den folgenden Code hinzu:

Ausschnitt:

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

Erläuterung:

Die Zurück-Schaltfläche gehört zum übergeordneten Ansichts-Controller. Das Navigation Itemgibt Ihnen ein Handle für die Zurück-Schaltfläche, sodass Sie den Titel im Code oder im Storyboard festlegen können.

Hinweis:

Wenn Sie den Navigation Item Back ButtonText als leere Standardzeichenfolge belassen, wird der Titel der Zurück-Schaltfläche zu "Zurück".

Andere Ansätze funktionieren, warum diesen verwenden?:

Während es möglich ist, den Titel der Zurück-Schaltfläche auf dem untergeordneten Ansichts-Controller zu überschreiben, war es eine Herausforderung, ihn in den Griff zu bekommen, bis er bereits kurz auf dem Bildschirm blinkte.

Einige der Ansätze erstellen eine neue Zurück-Schaltfläche und überschreiben die vorhandene. Ich bin sicher, dass es funktioniert und wahrscheinlich in einigen Anwendungsfällen notwendig ist. Ich bevorzuge es jedoch, vorhandene APIs zu nutzen, wenn dies möglich ist.

Das Ändern titledes übergeordneten Ansichtscontrollers ist in einigen Situationen die schnellste Lösung. Dadurch wird jedoch der übergeordnete Titel geändert, sodass Sie den Status verwalten müssen. Es wird auch chaotisch mit einem, Tab Bar Controllerweil Titeländerungen Nebenwirkungen bei den Tab Bar ItemTiteln verursachen.

Robert Chen
quelle
10

Wenn Sie Storyboards verwenden, wählen Sie einfach den übergeordneten Controller-Frame (nicht den mit der Zielansicht) aus (klicken Sie mit der rechten Maustaste auf die Navigationsleiste und öffnen Sie den Attributinspektor, in dem Sie drei Formulareingaben finden. Die dritte " Zurück-Taste "ist, dass wir suchen.

pedrouan
quelle
4
Dies ist die beste Lösung, wenn Sie sich nicht für die Lokalisierung interessieren.
MiQUEL
7

Schnelle Version:

In Ihrem Kind ViewController:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}
buxik
quelle
Dadurch wird der Titel des zuvor im Stapel befindlichen Ansichts-Controllers in "TEXT" geändert, was nicht ideal ist.
Gravitron
6

Hier ist eine andere Möglichkeit, dies zu tun.

Implementieren Sie in Ihrem übergeordneten Ansichtscontroller die folgende Methode:

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

Wenn Sie in Ihrem untergeordneten Ansichts-Controller den Titel ändern möchten, funktioniert dies wie folgt:

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

Ich konnte die parentViewControllerImmobilie nie zum Laufen bringen :

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

Ich weiß nicht, ob das ein Fehler ist oder ob ich ihn nicht richtig benutze. Das Ergreifen des vorletzten Ansichtscontrollers im viewControllersArray zeigt jedoch auf den übergeordneten Ansichtscontroller, und ich kann übergeordnete Methoden mit dieser Referenz korrekt aufrufen.

Alex Reynolds
quelle
6

OK. Ich persönlich hasste all diese Optionen. Deshalb habe ich mir meine eigenen ausgedacht.

Basierend auf den Informationen, die ich gesehen habe. Es scheint, dass der Controller für die vorherige Ansicht die Kontrolle über seine eigene Schaltfläche "Zurück" hat, die auf dem Controller für die Push-Ansicht angezeigt wird.

Ich habe eine Lazy Load-Methode für das Navigationselement auf dem Controller erstellt, die den geänderten Zurück-Button verwenden möchte.

Meins ist ein Invite Buyer Controller

Käufer einladen ist der standardmäßig festgelegte Text.

Die Schaltfläche "Zurück" musste jedoch "Einladen" sein

Hier ist der Code, mit dem ich die Schaltfläche "Zurück" erstellt habe.

Ich habe diesen Code oben in die Implementatio (.m) -Datei des Controllers eingefügt und er hat die Methode des Super automatisch überschrieben.

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

    return item;
}

Ich denke, dies ist ein viel eleganterer Weg, um dies zu erreichen.

Ich platziere diesen Code an einer Stelle und er wird bei Bedarf automatisch ausgefüllt.

Sie müssen den Code nicht vor jeder Push-Anforderung aufrufen.

Hoffe das hilft

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

Hier ist die Antwort:

In viewDidAppear:animated(NICHT in viewDidLoad) gehen Sie wie folgt vor

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

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

Das, wenn Sie die Form des Zurück-Buttons beibehalten möchten.

Basheer_CAD
quelle
Nicht schlecht, außer dass sie sehen können, wie sich die Titel ändern. Ich habe es in viewWillAppear versucht und es funktioniert nicht.
Travis M.
5

Keine der hier erläuterten Lösungen hat bei mir funktioniert. Also habe ich den Titel folgendermaßen aus der Szene entfernt, aus der ich gekommen bin:

self.title = @"";

Wenn also eine neue Szene präsentiert wird, erscheint der hintere Text nicht.

Ich stimme absolut zu, dass dies überhaupt keine klare Lösung ist, aber funktioniert hat und keine der Erklärungen für mich funktioniert hat.

Javier Calatrava Llavería
quelle
Mann, ich muss dir sagen, es ist 2017 und es ist immer noch ein Problem, mit dem Zurück-Knopf umzugehen. Ihre Methode hat bei mir funktioniert und ich habe das Zeichen "<" erhalten, obwohl ich das Wort "Abbrechen" wollte, aber ich werde mich mit dem zufrieden geben, was ich bekommen habe. :)
AnBisw
5

Ich habe festgestellt, dass es am besten ist, den Titel des aktuellen Ansichts-Controllers im Navigationsstapel in den gewünschten Text der Zurück-Schaltfläche zu ändern, bevor Sie zum nächsten Ansichts-Controller wechseln.

Zum Beispiel

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

Setzen Sie dann in viewDidAppear den Titel auf den gewünschten Titel für die ursprüngliche VC zurück. Voila!

OneInABajilian
quelle
5

Für 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.
quelle
4

Ich habe festgestellt, dass der einfachste Weg, den Namen der Zurück-Schaltfläche zu ändern, darin besteht, den Titel des Ansichts-Controllers auf den Titel der Zurück-Schaltfläche zu setzen und dann die titleView im Navigationselement des Ansichts-Controllers durch eine benutzerdefinierte Bezeichnung durch eine echte zu ersetzen Name.

So was:

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

Dadurch sieht Ihr Titel in UINavigationBar so aus, als wäre er nativ. Geben Sie dem Ansichts-Controller die Möglichkeit, Titel und Zurück-Schaltflächentitel zu trennen.

Im Fall der Ansichtssteuerungen A und B ist A dafür verantwortlich, festzulegen, wie die Zurück-Schaltfläche aussehen soll, während B angezeigt wird.

BEARBEITEN: Dadurch wird auch das native Erscheinungsbild der Zurück-Schaltfläche beibehalten (Element der linken Pfeilschaltfläche).

Trenskow
quelle
4

Dieser Code funktioniert auch. Stellen Sie dies auf den Root-Controller des Navigations-Controllers:

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

Ich bin neu in iOS, aber ich werde meine sehr einfache Antwort auf das Überschreiben der Navigationscontroller-Klasse geben. Ich habe einfach die Push- und Pop-Methoden überschrieben und den Titel des vorherigen Ansichts-Controllers gespeichert. Entschuldigung für das Einfügen in js Block. War wenig verwirrt, wie man es im normalen Codeblock einfügt.

#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

Sergey Brazhnik
quelle
4

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

Und in Swift:

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

Sie können es beliebig in den Code im parrent-Controller einfügen, sodass Sie unterschiedliche Backbuttons für verschiedene untergeordnete Ansichten haben können.

Chikuba
quelle
3

Bei den meisten Lösungen wird der ursprüngliche Stil von BackButton (die Schaltfläche mit dem linken Pfeil) aufgehoben, während eine übliche Schaltfläche mit dem gewünschten Titel hinzugefügt wird. Um
den ursprünglichen Stil beizubehalten, gibt es zwei Möglichkeiten:
1. Den undokumentierten Schaltflächenstil (110 oder ähnliches) zu verwenden, den ich lieber nicht mache. Wenn Sie möchten, finden Sie hier im Stackoverflow eine Anleitung.
2. Um die Idee von Trenskow zu verwenden. Mir hat es gefallen und ich benutze es etwas verändert.
Anstatt den Titel (NSString *) zu überschreiben, habe ich beschlossen, den Originaltitel folgendermaßen beizubehalten (wodurch ich die Titel der Feder sowie den angegebenen Titel übrigens im Push-Status verwenden kann).

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

Diese Lösung funktioniert gut und sieht nativ aus. Auch wenn es in der viewDidLoad-Methode verwendet wird, wird die Ausführung mehr als einmal verhindert.
Ich habe auch eine Jessedc-Lösung ausprobiert, aber sie sieht schlecht aus. Es bewirkt, dass die Titelleiste des Benutzers im Handumdrehen vom Original zum gewünschten und zurück von BackButton wechselt.

Stan
quelle
2

Dies funktioniert für mich als "vereinfachte" Version der zuvor veröffentlichten Antworten.

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

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

Denken Sie daran, den Code in den übergeordneten Ansichtscontroller einzufügen (z. B. die Ansicht mit Ihrer Tabellenansicht oder UITableViewController), nicht die untergeordnete Ansicht oder Detailansicht (z. B. UIViewController) einzufügen.

Sie können die Zeichenfolge der Zurück-Schaltfläche einfach wie folgt lokalisieren:

backButton.title = NSLocalizedString(@"Back Title", nil);
Lex L.
quelle
2

Wir haben zwei VCs A und B.

Wenn Sie den Titel in B ändern möchten, schreiben Sie diesen Code in 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
quelle
1

Stans Antwort war die beste. Es gibt jedoch auch ein Problem: Wenn Sie den Controller mit einer Registerkartenleiste verwenden und den Titel des Controllers ändern, können Sie auch den Titel der Registerkartenleiste ändern. Die beste Antwort ist also, nur den Titel view_controller.navigationItem.title zu ändern und view_controller.navigationItem zu verwenden .titel in der Funktion. Die Antwort ist hier: (Mit ARC und fügen Sie sie in viewDidLoad der Ansicht ein)

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

Bei meiner Verwendung mache ich es zu einer Funktion wie dieser, habe nur die Funktion mit einem Zeilencode in 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
quelle
1

PROBLEM: "Zurück" -Text in der Navigationsleiste kann nicht ersetzt werden.

GRUND: Die Bezeichnung "Zurück" wird in der Navigationsleiste nach dem Drücken einer Ansicht festgelegt, da das Attribut .title im übergeordneten Ansichtscontroller auf Null gesetzt (oder nicht initialisiert) wurde.

EINE LÖSUNG: Wenn Sie self.title = "Whatever ..." setzen, wird nach dem Drücken des neuen Ansichts-Controllers anstelle von "Back" "Whatever ..." angezeigt.

Javier Calatrava Llavería
quelle