2016-08-21 54 views
1

關於這個問題:How to change Back button text from within the child view controller?我正在尋找一個合適的方法來刷新導航欄後更改後退按鈕標題previousViewController.navigationItem.backBarButtonItem?.title = "New Title"如何正確刷新UINavigationBar?

從鏈接的問題的(不那麼理想的?)溶液:

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

編輯:

顯然改變層幀迫使導航欄刷新。 (?)不是一個解決方案,但更便宜的解決方法我想:

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

很多時候,當沒有一個簡單的方法來做你想做的事時,這是很好的理由。後退按鈕應將用戶帶回他們來自的地方,他們的導航歷史不應該被重寫。如果你在左上角需要一些其他的行爲(除了導航),你不需要使用'backBarButtonItem'。 – nhgrif

+0

在某些特定情況下,更改標題可改善用戶體驗。以WhatsApp爲例。 – MJQZ1347

+0

假設我從未使用過WhatsApp。 – nhgrif

回答

0

一個解決辦法是有一個功能,它通過在刪除/隱藏後退按鈕和顯示自定義的UIBarButtonItem完全改變了的UIBarButtonItem其與navigationItem.leftBarButtonItem屬性。肯定不理想,但按鈕並不意味着在VC生命週期中改變,所以我想你可以試試。從這個意義上說,沒有「適當」的方式,因爲這不被視爲標準行爲。

它的工作對我來說,當我在樣本視圖控制器中添加此功能按鈕:

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

但是後退箭頭呢?它缺少? – MJQZ1347

+0

@ MJQZ1347只需在標題中添加「<」並使用字體進行播放?或者查看下面的內容:http://stackoverflow.com/a/18874211/6597361但是無論如何這是一種非常簡單的方式,不適用於您的情況 – tech4242

+0

不幸的是,使用該解決方案時,重新掃描無法使用。還有一個更簡單的方法來刷新導航欄而不會彈出VC? – MJQZ1347

3

嘗試各種方法來刷新之後,我覺得這是最醜陋的解決方案,似乎工作(在至少在iOS 10):

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

其它方法嘗試:

  • 呈現的圖控制器(原因在某些情況下,屏幕閃爍)
  • 隱藏並重新顯示條(如果在backswipe到前一個VC之間的中途,中斷條)
  • 設置條的圖層框(看起來不可靠,明確禁止通過navigationBar的文檔)