如何正确刷新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)) }