Frage

Zur Zeit des linke Balken Schaltfläche Standardwert ist der Titel der Ansicht, dass die aktuellen geladen, mit anderen Worten die Ansicht angezeigt wird, wenn die Taste (Zurück-Taste) gedrückt wird.

Ich möchte den Text auf den Button, um etwas anderes gezeigt ändern.

habe ich versucht, die folgende Codezeile setzte in den viewDidLoad Methode des View-Controller, aber es scheint nicht zu funktionieren.

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

Was soll ich tun?

Danke.

War es hilfreich?

Lösung

Dies sollte in dem Verfahren aufgestellt werden, die die Viewcontroller Titel „newTitle“ nennen. Kurz vor der Schub- oder popViewController Aussage.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];

Andere Tipps

In ChildVC dies für mich gearbeitet ...

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

Werke in Swift auch!

self.navigationController!.navigationBar.topItem!.title = "Back"

Hier ist die Dokumentation für backBarButtonItem :

  

"Wenn dieser Navigationspunkt direkt unter dem oben Artikel ist in der   Stapel, der Navigation-Controller leitet die Zurück-Taste für die   Navigationsleiste von diesem Navigationspunkt. [...] Wenn du möchtest   geben Sie ein benutzerdefiniertes Bild oder Titel für die Zurück-Taste, können Sie eine zuweisen   benutzerdefinierte bar Schaltfläche Artikel (mit Ihrem eigenen Titel oder Bild) dazu   stattdessen Eigenschaft. "

View Controller A ( "Eltern" View-Controller):

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

Wenn andere View-Controller B ist auf der Oberseite des Navigationsstapels und A ist direkt darunter, B 's Zurück-Taste den Titel hat "Short" .

in Xcode 4.5 unter Verwendung von Storyboard, bei weitem der einfachste Lösung, habe ich festgestellt, wenn der Wert der Zurück-Taste muss nicht dynamisch die „Zurück-Taste“ mit dem Navigation Artikel der View-Controller zugeordnet verwenden ändern zu dem Sie die Schaltfläche „Zurück“, etwas anderes zu sagen.

z. in der Abbildung unten, ich will die Zurück-Taste für die View-Controller (n), i drücken Sie „Zurück“, wie der Titel der Zurück-Taste zu haben.

eingeben Bild Beschreibung hier

Natürlich wird dies nicht funktionieren, wenn Sie die Zurück-Taste müssen leicht jedes Mal etwas anderes zu sagen ... es gibt alle anderen Lösungen, die hier dafür.

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

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

Werke von childView! Getestet mit iOS 7.

Vielleicht ich nicht vorbei simpel bin aber von der Apple-Dokumentation der Wortlaut ist:

  

Wenn ein benutzerdefinierte bar Taste Element wird nicht durch eine des View-Controller angegeben, eine Standard-Zurück-Taste wird verwendet, und der Titel wird auf den Wert des Titels eingestellt Eigenschaft der vorhergehenden view-Controller-das die view-Controller einer Ebene nach unten auf dem Stapel ist.

Die Lösung richtig oben markiert setzt ein Standard-Schaltfläche Element aus der übergeordneten Steuerung. Es ist die richtige Antwort, aber ich bin zu lösen das Problem, indem self.title Eigenschaft der UIViewController Wechsel kurz vor den neuen Controller auf den Navigation Stapel schieben.

Dies aktualisiert automatisch die Titel der Zurück-Taste auf dem nächsten Controller, und so lange, wie Sie self.title zurück zu dem, was es in viewWillAppear soll ich diese Methode nicht sehen können zu viele Probleme verursachen.

Diese Arbeit besser für mich. Versuchen Sie:

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

In Swift / iOS8, folgenden arbeitete für mich:

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

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

Portiert von Felipes Antwort.

Ok, hier ist der Weg. Wenn Sie einen View-Controller „erste“ und Sie navigieren einen anderen View-Controller „zweite“ per Knopfdruck oder usw. müssen Sie einige Arbeit tun. Zuerst müssen Sie einen BarButtonItem in „zweiter“ View-Controller des ViewDidLoad Methode wie folgt erstellen;

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

Wenn Sie das tun, was Sie brauchen für „btnBack“ Aktion in der gleichen .m-Datei wie dieser Code zu schreiben;

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

Das ist alles.

Ich hatte einen übergeordneten View-Controller mit einem wirklich langen Titel. Dies führte in dem Text zurück Taste in den Titel der View-Controllers Kind Blutungen.

Nachdem eine Reihe von verschiedenen Lösungen versucht, das ist, was ich am Ende tun (Erweiterung auf dem @ john.k.doe Ansatz):

Mit Xcode 7.2, Swift 2

  1. Im Storyboard, fügen Sie ein Navigation Item zum Eltern View-Controller-Szene (nicht das Kind VC)

Navigation item

  1. Auf dem Attributes Inspector Ihren neuen Navigation Item, geben Sie in einem space Zeichen im Back Button Feld. Mehr dazu später.

Navigation Element in der Ansicht Hierarchie

hinzufügen ein Leerzeichen an den Back Button Feld

  1. Im Eltern View-Controller, fügen Sie den folgenden Code ein:

Snippet:

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

Erklärung:

Die Zurück-Taste Art gehört von der Mutter View-Controller. Die Navigation Item gibt Ihnen einen Griff auf die Zurück-Taste, so können Sie den Titel im Code oder im Storyboard festgelegt.

Hinweis:

Wenn Sie den Navigation Item Back Button Text als Standard leere Zeichenfolge verlassen, das Zurück-Taste Titel wird „Zurück“.

Andere Ansätze arbeiten, warum diese benutzen:

Es ist zwar möglich, den Zurück-Button Titel auf den Kind-View-Controller außer Kraft zu setzen, war es eine Herausforderung, einen Griff zu bekommen es, bis es bereits kurz auf dem Bildschirm blitzte hatte.

Einige der Ansätze eine neue Back-Button erstellen und die vorhandenen außer Kraft setzen. Ich bin sicher, dass es funktioniert, und wahrscheinlich in einigen Anwendungsfällen notwendig. Aber ich ziehe bestehende APIs zu nutzen, wenn möglich.

Ändern der title des übergeordneten View-Controller ist die schnellste Lösung für einige Situationen. Dies ändert sich jedoch die übergeordnete Titel, so dass Sie Zustand zu verwalten haben. Dinge auch mit einem Tab Bar Controller chaotisch, weil Titeländerungen Nebenwirkungen mit dem Tab Bar Item Titel führen.

Für die Storyboards nur mit der Mutter wählen (nicht die, die Zielansicht hält) View-Controller Rahmen (sicher sein, dass Sie sich auf der Navigationsleiste klicken, dann öffnet Attribut Inspektoren, wo Sie drei Formulareingaben finden. Die dritte „zurück-Button“ ist, dass wir auf dem Bild.

Swift-Version:

Ihr Kind Viewcontroller:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}

Hier ist eine andere Art und Weise, es zu tun.

In Ihren Eltern-View-Controller, implementieren Sie die folgende Methode:

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

In Ihrem Kind-View-Controller, wenn Sie den Titel ändern möchten, dies funktionieren wird:

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

ich war nie in der Lage, die parentViewController Eigenschaft an der Arbeit:

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

Ich weiß nicht, ob das ein Bug ist oder ich verwende es nicht richtig. Aber Ergreifen des zweiten bis letzten View-Controller in den viewControllers Array zeigt auf den übergeordneten View-Controller, und ich kann mit dieser Referenz Mutter Methoden korrekt aufrufen.

ok. Ich hasste persönlich alle diese Optionen. Deshalb kam ich mit meiner eigenen auf.

Auf der Grundlage der Informationen, die ich gesehen habe. Es scheint, dass die vorherigen Ansicht-Controller in Kontrolle ihrer eigenen Schaltfläche „Zurück“, die auf dem gedrückten View-Controller vorgestellt werden.

Ich habe eine Lazy Load-Methode für die navigationItem auf dem Controller erstellt, die den geändert Back Button will.

Meins ist ein Einladen Käufer-Controller

einladen Käufer ist der Text, der standardmäßig eingestellt ist.

aber die Zurück-Taste erforderlich einladen wird

Hier ist der Code, den ich verwendet, um die Zurück-Taste zu erstellen.

Ich legte diesen Code in der Spitze des Implementatio des Controllers (.m-Datei) und es überwog Methode des Super des automatisch.

- (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 finde, dass das ein viel elegantere Weg ist, um dies zu erreichen.

ich diesen Code an einem Ort, und es wird automatisch ausgefüllt, wenn nötig.

Keine Notwendigkeit, den Code vor jeder Push-Anforderung zu nennen.

Hope, das hilft

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

Hier ist die Antwort:

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

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

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

Dass, wenn Sie die Form der Zurück-Taste halten wollen.

Keine der Lösungen erklärt für mich hier gearbeitet. Also, was ich tat, war der Titel aus der Szene entfernen, wo ich in der folgenden Art und Weise kam:

self.title = @"";

Also, wenn neue Szene die Rückseite Text präsentiert wird nicht angezeigt.

Ich Absoluty darüber einig, dass dies überhaupt nicht eine klare Lösung, aber gearbeitet und keine der für mich gearbeitet erklärt.

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

Ich habe festgestellt, dass der einfachste Weg, den Namen der Zurück-Taste zu ändern, ist der Ansicht-Controller Titel auf den Titel der Zurück-Taste zu setzen, und dann die Titleview im Controller Navigationspunkt Ansicht ersetzt, um ein benutzerdefiniertes Etikett mit seinem richtigen Namen.

Wie folgt aus:

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

Dies wird Ihren Titel in UINavigationBar aussehen, als ob es heimisch. View-Controller die Fähigkeit, Titel und Zurück-Button Titel getrennt haben.

Im Fall der View-Controller A und B, A ist verantwortlich für die erzählen, wie es ist wieder sollte Schaltfläche aussehen, während B angezeigt wird.

EDIT: Dies hält auch den Zurück-Taste native Look (Die linksen arrowed bar Taste Artikel)

.

Dieser Code funktioniert auch. Setzen Sie diese auf dem Root-Controller der Navigationssteuerung:

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

Ich habe festgestellt, dass es am besten ist es, den Titel der aktuellen View-Controller in dem Navigationsstapel auf den gewünschten Text der Zurück-Taste zu ändern, bevor er zum nächsten View-Controller drücken.

Zum Beispiel

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

Dann in der viewDidAppear setzte den Titel für das Original VC auf den gewünschten Titel zurück. Voila!

Im neu in iOS, aber ich werde meine sehr einfache Antwort von Überschreiben der Navigation Controller-Klasse bieten. Ich habe einfach überschreibt die Push- und Pop-Methoden und den Titel der vorherigen View-Controller speichern. Sorry für das Einfügen in js Block. War etwas verwirrt, wie man daran vorbei in normalen Codeblock.

#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

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

Und in Swift:

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

Sie können es setzen, wohin Sie in dem Code in dem parrent Controller mögen, die Sie differenct backbuttons für verschiedenes Kind Blick haben allowes.

Die meisten Lösungen töten den ursprünglichen Stil des Backbutton (Die linke Balken Taste Pfeil), während eine übliche Taste mit dem gewünschten Titel hinzufügen.
So den ursprünglichen Stil zu halten, gibt es 2 Möglichkeiten:
1. Platz: Um nicht dokumentiert Tastenstil (110 oder so ähnlich) benutzen, die ich nicht zu bevorzugen. Aber wenn Sie möchten, könnten Sie finden, wie es hier zu tun, auf Stackoverflow.
2. Ich, der Trenskow Idee zu verwenden. Ich mochte es und ich benutze es ein bisschen verändert.
Statt zwingenden - (NSString *) Titel habe ich beschlossen, den Originaltitel in der folgenden Art und Weise zu halten (was ich nib den Titel sowie bestimmte Titel bei Push-Zustand verwenden kann 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; 
    }
}

Diese Lösung funktioniert gut und es sieht heimisch. wenn auch verwendet in viewDidLoad Verfahren verhindert die Ausführung mehr als 1 mal.
Auch habe ich versucht, eine Jessedc-Lösung, aber es sieht schlecht aus. Es bewirkt, dass sichtbar Benutzer Titelleiste Fliegender Wechsel von Original Backbutton des gewünschten und zurück.

Das funktioniert für mich als „vereinfachte“ Version der bisherigen geschrieben Antworten.

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

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

Denken Sie daran, den Code innerhalb der übergeordneten View-Controller (zum Beispiel der Ansicht, dass Ihre Tabellenansicht oder UITableViewController hat) zu setzen, nicht , um das Kind oder Detailansicht (z UIViewController).

Sie können ganz einfach die Zurück-Taste Zeichenfolge wie folgt lokalisiert:

backButton.title = NSLocalizedString(@"Back Title", nil);

Wir haben zwei VCs A und B.

Wenn Sie Titel in B ändern, 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)

Stan Antwort war die beste. Aber es habe auch ein Problem, wenn Sie den Controller mit einer Tab-Leiste verwenden und den Titel des Controllers ändern, können Sie die Tab Bar Titel ändern too.So die beste Antwort ist den view_controller.navigationItem.title nur ändern, und verwenden Sie die view_controller.navigationItem .title in der Funktion. Die Antwort ist hier ein: (Mit ARC und fügen Sie sie in den Blick des 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;
  }

In ich verwenden, Ich mache es eine Funktion wie diese, hat nur die Funktion mit einer Zeile Code in der 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;
  }
}

Wenn Sie wollen nicht nur den Text der Zurück-Taste, um den gleichen Text zu ändern und die ursprüngliche linke Pfeilform bleiben, sondern auch etwas zu tun, wenn der Benutzer die Zurück-Schaltfläche klickt, empfehle ich Sie einen Blick haben um meinen " CustomNavigationController ".

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

. Grund: „Back“ Label wird in der Navigationsleiste nach einer Ansicht drücken, weil das .title Attribut in dem übergeordneten View-Controller auf Null (oder nicht initialisiert) eingestellt wurde

eine Lösung:. Wenn Sie die self.title gesetzt = „Wie auch immer ...“ Sie werden sehen, dass anstelle von „Back“ erscheint „Wie auch immer ...“ nach neuen View-Controller drücken

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top