Benutzerdefinierter Text von UINavigationController "Zurück"?


147

Die "Zurück-Schaltfläche" von a UINavigationControllerzeigt standardmäßig den Titel der letzten Ansicht im Stapel an. Gibt es eine Möglichkeit, stattdessen benutzerdefinierten Text in der Zurück-Schaltfläche zu haben?


1
Diese Arbeit für michself.navigationController.navigationBar.topItem.title = @"Custom text";
Huync

Antworten:


342

Von diesem Link :

self.navigationItem.backBarButtonItem =
   [[UIBarButtonItem alloc] initWithTitle:@"Custom Title"
            style:UIBarButtonItemStylePlain
           target:nil
           action:nil];

Wie Tyler in den Kommentaren sagte:

Tun Sie dies nicht im sichtbaren Ansichts-Controller, sondern im Ansichts-Controller, den Sie sehen würden, wenn Sie auf die Schaltfläche "Zurück" klicken


4
Du solltest releasedas UIBarButtonItem.
Mehrdad Afshari

217
Beachten Sie auch, dass Sie dies im View Controller eine Ebene höher im Stapel tun müssen. Mit anderen Worten, tun Sie dies nicht im sichtbaren Ansichts-Controller, sondern im Ansichts-Controller, den Sie sehen würden, wenn Sie auf die Schaltfläche "Zurück" klicken.
Tyler

6
Nur um Tylers Kommentar zu verdeutlichen, da ich dies zunächst nicht verstanden habe: Festlegen des backBarButtonItem in einem View-Controller-NavigationItem setzt die Schaltfläche, die angezeigt wird, um zu diesem View-Controller zurückzukehren. Beachten Sie auch, dass es zwar keinen Schaltflächenstil für die Pfeiltaste gibt, diese Schaltfläche jedoch trotzdem den Pfeilstil erhält. Ich habe UIBarButtonItemStylePlain verwendet und erhalte immer noch den Pfeilschaltflächenstil.
Jon Steinmetz

3
Vorschlag: Anstatt den Stil anzunehmen, übergeben Sie den aktuell festgelegten Stil. Ersetzen Sie im Code dieser Antwort durch UIBarButtonItemStyleBorderedeinen Aufruf der Eigenschaft self.navigationItem.backBarButtonItem.style. Dokumentation: developer.apple.com/library/ios/documentation/uikit/reference/…
Basil Bourque

1
Beachten Sie, dass Sie unter ARC den Autorelease-Aufruf weglassen müssen. Sie haben also self.navigationItem.backBarButtonItem = [[UIBarButtonItem-Zuweisung] initWithTitle: @ "Benutzerdefinierter Titel" -Stil: UIBarButtonItemStyleBordered target: nil action: nil];
bkbeachlabs

43

Sie können den Text im Interface Builder festlegen:

Wählen Sie das Navigationselement des ViewControllers aus, zu dem die Zurück-Schaltfläche zurückkehren soll:

Geben Sie hier die Bildbeschreibung ein

Geben Sie im Attributinspektor des Dienstprogrammfensters Ihre Bezeichnung für die Schaltfläche "Zurück" ein:

Geben Sie hier die Bildbeschreibung ein

Ich würde diesen Ansatz dem Setzen des Titels im Code wie in der akzeptierten Antwort vorziehen.

Beachten Sie auch, dass Sie dies im View Controller eine Ebene höher im Stapel tun müssen. Mit anderen Worten, tun Sie dies nicht im sichtbaren Ansichts-Controller, sondern im Ansichts-Controller, den Sie sehen würden, wenn Sie auf die Schaltfläche "Zurück" klicken.
- Tyler


Dies ist die beste Antwort, die ich bisher gefunden habe.
Ayan Sengupta

2
Um dies zu verdeutlichen, muss dies im Navigationselement des Ansichtscontrollers festgelegt werden, nicht im Attributinspektor des Ansichtscontrollers.
Patrick Read

Dies ist die beste Antwort, die ich gefunden habe.
Bizepsjai

Dies ist die beste Antwort
Alex Brown

2
Ab Xcode 6.1.1 und unter iOS 7 scheint Ihr ursprünglicher Titel der vorherigen Ansicht NOCH den hier festgelegten Titel der Zurück-Schaltfläche zu überschreiben. Wenn der Titel der vorherigen Ansicht mehr als 11 Zeichen enthält, wird auf der Zurück-Schaltfläche der nächsten Ansicht einfach "Zurück" angezeigt. Es führt kein Weg daran vorbei, außer ein neues Navigationsleistenelement von Grund auf neu zu erstellen, wie in der Antwort mit der höchsten Abstimmung hier gezeigt.
Ray

22

Ich benutze das:

// In the current view controller, not the one that is one level up in the stack
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.backItem.title = @"Custom text";
}

Das funktioniert fast für mich, aber wenn ich auf die Schaltfläche "Zurück" klicke, ändert sich der Text für die Dauer der Animation wieder in den Titel des übergeordneten Elements :-(
Danny Tuppeny

3
Dadurch wird der Titel der Zurück-Schaltfläche des Controllers im Stapel geändert. Der Titel der Zurück-Schaltfläche des aktuell angezeigten Controllers wird nicht geändert. Noch schlimmer: Es ändert den Titel des Controllers vor dem vorherigen Controller!
Leviathan

Wie von anderen Kommentatoren festgestellt, ist diese Methode etwas unhaltbar. Ich würde dies nicht empfehlen, da es nicht wirklich so ist, wie die API es beabsichtigt. Sie könnten sich in Zukunft auf schwierige Fehler einstellen!
RickDT

11

Ich fand eine praktische Lösung dafür, indem ich einfach den Titel des Controllers festlegte, bevor ich einen anderen Controller auf den Stapel schob, wie folgt:

self.navigationItem.title = @"Replacement Title";
[self.navigationController pushViewController:newCtrl animated:YES];

Stellen Sie dann sicher, dass Sie den Originaltitel viewWillAppearwie folgt eingeben:

-(void)viewWillAppear:(BOOL)animated
{
  ...
  self.navigationItem.title = @"Original Title";
  ...
}

Dies funktioniert, weil das Standardverhalten UINavigationControllerbeim Erstellen der Zurück-Schaltfläche während eines Push-Vorgangs darin besteht, den Titel des vorherigen Controllers zu verwenden.


1
Das Problem dabei ist, dass sich der Titel in der alten Ansicht ändert, wenn sie animiert wird und ein bisschen naff aussieht. Keine der hier angegebenen Lösungen scheint so zu funktionieren, wie Sie es möchten :-(
Danny Tuppeny

1
Dies ist in meiner Situation perfekt, da ich die NavBar auf dem vorherigen Bildschirm nicht anzeige und nur das titleLabel von der Zurück-Schaltfläche auf dem neuen Bildschirm entfernen möchte und nur den iOS7-Chevron-Pfeil habe. Ich kann daher einfach ein leeres NSString-Literal für den Titel setzen.
Geschwister

Pushing View Controller löst die Ausnahme aus, wenn Sie auf den Rücken tippen
Sumit

7

Der Titel der Schaltfläche "Zurück" ist standardmäßig der Titel der vorherigen Ansicht. Ein schneller Trick, den ich verwende, besteht darin, den folgenden Code in die .m-Datei der vorherigen Ansicht zu platzieren.

-(void)viewWillAppear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Original Title";
}

-(void)viewWillDisappear:(BOOL)animated {

    // Set title
    self.navigationItem.title=@"Back";
}

Dies funktioniert in vielen Fällen ziemlich gut und ist ziemlich einfach. Die einzige Beobachtung ist, dass das Überschreiben einer dieser Methoden erfordert, dass die Implementierung des Super irgendwann in der neuen Methode aufgerufen wird.
izk

2
Bei dieser Methode wird festgestellt, dass der Titel der übergeordneten Ansicht in "Zurück" geändert wird, bevor die Push-Animation ausgeführt wird. (Und irgendwie scheiße, wenn Sie dies in die viewDidDisappear-Methode verschieben, sehen Sie den Wechsel nach dem Push ..)
James Boutcher

Ich liebe diese Methode, aber das Problem dabei ist, dass der "Originaltitel" in Ordnung gesetzt wird, aber mit einem Auslassungszeichen versehen ist, wenn er länger als "Zurück" ist, was daran liegen muss, da sich die Ansicht noch nicht in der Ansichtshierarchie befindet wird die Titelansicht nicht weitergeleitet. Das von @JamesBoutcher oben beschriebene Problem ist für mich aufgrund der schnellen Anfangsgeschwindigkeit der Animation nicht erkennbar. Tatsächlich habe ich gerade festgestellt, dass das Problem, mit dem ich konfrontiert bin, besonders durch langsame Animationen auffällt, wenn dieses Problem auftritt.
trss

Während sich die Antwort unter stackoverflow.com/questions/1441699/… nach mehr Anpassung als nötig anfühlt, ist dies der dokumentierte Weg und scheint vor allem mehr auf unsere Absicht ausgerichtet zu sein.
trss

6

Fügen Sie in Ihrer Init-Methode den folgenden Code hinzu:

- (id)initWithStyle:(UITableViewStyle)style {
    if(self = [super init]) {

        //...

        UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                             style:UIBarButtonItemStylePlain 
                                            target:self 
                                            action:@selector(goBack)];
        self.navigationItem.leftBarButtonItem = customBackButton;
        [customBackButton release];

        //...
    }
    return self;
}

Fügen Sie dann eine einfache Methode hinzu, damit Viewcontroller geschlossen werden kann:

-(void)goBack {
    [self.navigationController popViewControllerAnimated:YES];  
}

3

Fügen Sie den folgenden Code in viewDidLoad oder loadView hinzu

self.navigationController.navigationBar.topItem.title = @"Custom text";

Ich habe es in iPhone und iPad mit iOS 9 getestet


Sollte self.navigationController sein? .NavigationBar.backItem? .Title = "Benutzerdefinierter Text"
Peacemoon

1
Der einzige Unterschied, den ich brauchte, war die optionale Verkettung der Eigenschaften navigationControllerund topItem, z. B.:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
Bulwinkel

2

Hinzufügen zu Zügels Antwort. Beachten Sie aus Apples Dokumenten, dass die Deklaration von backBarButtonItem wie folgt lautet:

@property(nonatomic, retain) UIBarButtonItem *backBarButtonItem

Daher wird durch die Antwort von rein Speicher verloren gehen, da der synthetisierte Setter retaindie Instanz, an die Sie ihn übergeben, übergibt, die niemals explizit freigegeben wird. Sie können dies beheben, indem Sieautorelease

 self.navigationItem.backBarButtonItem = 
      [[[UIBarButtonItem alloc] initWithTitle:@"Custom Title" 
         style:UIBarButtonItemStyleBordered
         target:nil
         action:nil] autorelease];  //<-- autoreleased

Oder Sie können eine Variable auf die Instanz verweisen, um sie später explizit freizugeben:

UIBarButtonItem* item = ...
self.navigationItem.backBarButtonItem = item;
[item release];

Hoffe das hilft!


Beachten Sie, dass Sie sich heutzutage mit ARC keine Gedanken mehr über die Autorelease machen müssen (und der Compiler wird tatsächlich einen Fehler machen, wenn Sie versuchen, die Autorelease in einem ARC-fähigen Projekt durchzuführen)
Eric Goldberg

2
- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
  self.navigationItem.backBarButtonItem = backButton;
  [backButton release];
}

2

Ich habe etwas Interessantes entdeckt. Wenn Sie UINavigationControllerdie pushViewController:animated:Methode unterordnen und überschreiben und Folgendes tun: (Denken Sie daran, dass ich ARC verwende.)

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] 
 initWithTitle: @"Back" 
 style: UIBarButtonItemStyleBordered
 target: nil action: nil];

viewController.navigationItem.backBarButtonItem = backButton;

[super pushViewController:viewController animated:animated];

Dann für alle ViewControllers , die mit Ihrem Navigationscontroller gedrückt werden, wird automatisch die Schaltfläche "Zurück" angezeigt. Wenn Sie den Text für bestimmte Ansichtscontroller ändern möchten, können Sie versuchen, den Ansichtscontroller in eine bestimmte Klasse oder Ihr eigenes benutzerdefiniertes Protokoll umzuwandeln (das Ihr Ansichtscontroller erbt und von dem eine Methode backButtonTextoder etwas Dummes wie diese stammt) Bestimmte Informationen auf dem Viewcontroller, die im Lieferumfang enthalten sind, können Sie den Text der Zurück-Schaltfläche anpassen. Jetzt wird der Text der Zurück-Schaltfläche an einer Stelle erledigt, die ausschließlich die Verantwortung tragen sollte. Ich muss zugeben, dass das Erstellen einer neuen Schaltfläche zum Ändern des Textes zum Kotzen ist, aber na ja.

Kann sich jemand einen Grund vorstellen, warum man es nicht so macht? Zumindest müssen Sie nicht mit Viewcontroller-Titeln herumspielen oder daran denken, eine neue Zurück-Schaltfläche zu erstellen, bevor Sie den Viewcontroller auf dem Navigationscontroller drücken.


0

Die Antwort von rein funktioniert gut.

Beachten Sie, dass, wenn Sie mehr als einen Ansichts-Controller drücken, der geänderte Titel der Zurück-Schaltfläche für jeden von ihnen angezeigt wird, was möglicherweise nicht Ihren Wünschen entspricht.

In diesem Fall müssen Sie das benutzerdefinierte UIBarButtonItem jedes Mal erstellen, wenn Sie einen Ansichts-Controller drücken.

Stellen Sie außerdem sicher, dass Sie dies tun, bevor Sie den Ansichts-Controller drücken. Andernfalls wird ein Bildschirmschluckauf angezeigt, wenn sich der Titel ändert.


0

Wenn Sie Aubreys Vorschlag erweitern, können Sie dies im untergeordneten Ansichts-Controller tun:

Erstellen Sie zwei Variablen zum Speichern der alten Werte des übergeordneten Navigationsobjekts und des Navigationselements des übergeordneten Elements

UINavigationItem* oldItem;
NSString* oldTitle;

in viewDidLoadden folgenden:

oldItem = self.navigationController.navigationBar.topItem;  
oldTitle = oldItem.title;  
[oldItem setTitle: @"Back"];  

in viewWillDisappearden folgenden:

[oldItem setTitle: oldTitle];  
oldTitle = nil;  // do this if you have retained oldTitle
oldItem = nil;   // do this if you have retained oldItem

Es ist nicht perfekt. Sie werden sehen, wie sich der Titel der übergeordneten Ansicht ändert, wenn der neue Controller animiert wird. ABER dies erreicht das Ziel, die Zurück-Schaltfläche benutzerdefiniert zu beschriften und sie wie eine Standard-Zurück-Schaltfläche zu halten.


0

Setzen Sie dies in Sie ein viewDidLoad, hoffen Sie , dass es zu dem führt, was Sie suchen

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" 
style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backBarButtonItem;
[backBarButtonItem release];

0

Wenn Sie den Titel im ARRIVING-Controller (manchmal mehr Logik) in Swift 3 festlegen möchten, gehen Sie wie folgt vor:

func setBackButtonNavBar(title: String, delay: Double){

    let when = DispatchTime.now() + delay
    DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in

        if let navBar = self.navigationController?.navigationBar{
            navBar.backItem?.title = title
        }
    })

}

im kommenden Controller:

override func viewDidLoad() {
    super.viewDidLoad()
    self.setBackButtonNavBar(title: "back", delay: 0.3)
}

Normalerweise füge ich self.setBackButtonNavBar in eine Controller-Erweiterung ein.


0

Ich weiß, dass dies eine alte Frage ist und die Antworten irgendwie aktualisiert wurden!

Der einfache Weg ist, dies im übergeordneten ViewController zu tun:

dh derjenige, der Sie zum nächsten View Controller führt.

self.navigationItem.backBarButtonItem  = UIBarButtonItem(title: "Custom text here", style: .plain, target: nil, action: nil)

-1

Wenn Sie dies im Code tun, entfernen Sie den Zurück-Button-Stil des UINavigationConroller. Wenn Sie in jeder Ihrer Ansichten ein Navigationselement hinzufügen, können Sie den Titel der hinteren Schaltfläche in der Ansicht festlegen StoryBoard.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.