2016-08-21 53 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的文档)