2016-08-21 4 views
1

In Bezug auf diese Frage: How to change Back button text from within the child view controller? Ich suche nach einer propery Weg, um die Navigationsleiste nach dem Ändern der Zurück-Schaltfläche Titel mit previousViewController.navigationItem.backBarButtonItem?.title = "New Title" zu aktualisieren.Wie wird eine UINavigationBar richtig aktualisiert?

Die (nicht so ideal?) Lösung aus der verknüpften Frage:

if let navigationController = self.navigationController { 
    navigationController.popViewControllerAnimated(false) 
    navigationController.pushViewController(self, animated: false) 
} 

Edit:

Offenbar den Schichtwechselrahmen zwingt die Navigationsleiste zu aktualisieren. (?) Keine Lösung, aber eine weniger teuere Abhilfe, die ich denke:

if let navigationController = self.navigationController { 
    navigationController.navigationBar.layer.frame.insetInPlace(dx: 0.1, dy: 0) 
    navigationController.navigationBar.layer.frame.insetInPlace(dx: -0.1, dy: 0) 
} 
+0

Eine Menge Zeit, wenn es nicht eine geradlinige Möglichkeit zu tun, was Sie tun möchten, ist es aus gutem Grund. Der Zurück-Knopf sollte den Benutzer dorthin zurückbringen, wo er hergekommen ist, und sein Navigationsverlauf sollte nicht neu geschrieben werden. Wenn Sie eine andere Art von Verhalten benötigen (anders als zurück zu navigieren) in der oberen linken Ecke, müssen Sie nicht das 'backBarButtonItem' verwenden. – nhgrif

+0

In bestimmten Situationen verbessert das Ändern des Titels die Benutzerfreundlichkeit. Nehmen Sie WhatsApp als Beispiel. – MJQZ1347

+0

Angenommen, ich habe WhatsApp noch nie benutzt. – nhgrif

Antwort

0

Eine Lösung wäre, eine Funktion zu haben, die die UIBarButtonItem völlig verändert durch Entfernen/Ausblenden der Zurück-Taste und zeigt einen benutzerdefinierte UIBarButtonItem in seinem Ort mit der navigationItem.leftBarButtonItem Eigenschaft. Sicherlich nicht ideal, aber der Button ist nicht dafür gedacht, sich während des VC-Lebenszyklus zu ändern, also denke ich, dass Sie es versuchen könnten. In diesem Sinne gibt es keinen "richtigen" Weg, da dies kein Standardverhalten ist.

Es funktionierte für mich, wenn ich diese Funktion auf eine Taste auf einem Probe-View-Controller hinzugefügt:

func changeBackButton() { 
    navigationItem.hidesBackButton = true 
    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Test", style: .plain, target: self, action: #selector(test)) 
} 
+0

Aber was ist mit dem Zurück Pfeil? Es fehlt? – MJQZ1347

+0

@ MJQZ1347 Einfach "<" zum Titel hinzufügen und mit der Schrift herumspielen? Oder überprüfen Sie dies: http://StackOverflow.com/A/18874211/6597361 Aber so oder so ist es ein sehr einfacher Weg aus Ihrer Situation – tech4242

+0

Leider Swipe zurück zu gehen funktioniert nicht mehr mit dieser Problemumgehung. Auch muss es eine einfachere Möglichkeit geben, die Navigationsleiste zu aktualisieren, ohne den VC zu öffnen? – MJQZ1347

3

Nach dem Versuch, verschiedene Methoden zu aktualisieren, finde ich dies die am wenigsten hässliche Lösung, die (zu funktionieren scheint bei dest auf iOS 10):

guard let navigation = navigationController, 
     !(navigation.topViewController === self) else { 
    return 
} 
let bar = navigation.navigationBar 
bar.setNeedsLayout() 
bar.layoutIfNeeded() 
bar.setNeedsDisplay() 

Andere Methoden versucht:

  • eine Ansicht Controller Presenting (Ursachen Bildschirm in einigen Fällen zu flimmern)
  • Balken ausblenden und erneut anzeigen (Balken auf halbem Weg zwischen Backswipe und vorherigem VC)
  • Einstellung des Rahmens der Leiste (scheint nicht zuverlässig zu funktionieren und ist ausdrücklich verboten von der Dokumentation für navigationBar)
Verwandte Themen