Die "Zurück-Schaltfläche" von a UINavigationController
zeigt 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?
Die "Zurück-Schaltfläche" von a UINavigationController
zeigt 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?
Antworten:
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
release
das UIBarButtonItem
.
UIBarButtonItemStyleBordered
einen Aufruf der Eigenschaft self.navigationItem.backBarButtonItem.style
. Dokumentation: developer.apple.com/library/ios/documentation/uikit/reference/…
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 im Attributinspektor des Dienstprogrammfensters Ihre Bezeichnung für die Schaltfläche "Zurück" 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
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";
}
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 viewWillAppear
wie folgt eingeben:
-(void)viewWillAppear:(BOOL)animated
{
...
self.navigationItem.title = @"Original Title";
...
}
Dies funktioniert, weil das Standardverhalten UINavigationController
beim Erstellen der Zurück-Schaltfläche während eines Push-Vorgangs darin besteht, den Titel des vorherigen Controllers zu verwenden.
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";
}
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];
}
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
navigationController
und topItem
, z. B.:self.navigationController?.navigationBar.topItem?.title = "Custom Text"
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 retain
die 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!
Ich habe etwas Interessantes entdeckt. Wenn Sie UINavigationController
die 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 backButtonText
oder 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.
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.
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 viewDidLoad
den folgenden:
oldItem = self.navigationController.navigationBar.topItem;
oldTitle = oldItem.title;
[oldItem setTitle: @"Back"];
in viewWillDisappear
den 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.
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];
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.
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)
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
.
self.navigationController.navigationBar.topItem.title = @"Custom text";