如何正确刷新UINavigationBar?

关于这个问题: 如何在子视图控制器中更改后退按钮文本? 在使用previousViewController.navigationItem.backBarButtonItem?.title = "New Title"更改后退按钮标题后,我正在寻找一种刷新导航栏的方法。

来自链接问题的(不太理想?)解决方案:

 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) } 

尝试各种方法刷新后,我发现这是最难看的解决方案似乎有效(至少在iOS 10上):

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

尝试了其他方法:

  • 呈现视图控制器(在某些情况下导致屏幕闪烁)
  • 隐藏并重新显示栏(如果在回溯到前一个VC之间的中途,则会中断栏)
  • 设置条形图层的框架(似乎不能可靠地工作,并且被navigationBar的文档明确禁止)

一种解决方案是拥有一个函数,它通过删除/隐藏后退按钮并使用navigationItem.leftBarButtonItem属性在其位置显示自定义UIBarButtonItem来完全更改UIBarButtonItem。 肯定不理想,但按钮不是要在VC生命周期中改变,所以我想你可以试试。 从这个意义上说,没有“正确”的方式,因为这不被视为标准行为。

当我将此函数添加到示例View Controller上的按钮时,它对我有用:

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