我在导航控制器中嵌入了多个视图控制器。我有一个选项可以更改用户界面的语言。当用户选择法语时,用户界面应使用法语自行更新。除了将用户带回到前一个视图控制器的按钮之外,所有元素都按照我的预期更新为法语(如屏幕截图所示 - “事件列表”)。
这是我调用更新UI的功能:
func updateView() {
DispatchQueue.main.async {
// CurrentSelection.LanguageUI holds a reference to currenly selected language object
navigationItem.title = CurrentSelection.languageUI.event_singular
navigationController?.title = CurrentSelection.languageUI.listOfEvents <<- this line doesn't work
}
}
navigationController?.title包含“事件列表”字符串,并且赋值语句似乎有效。只是UI没有使用新标题值更新。我哪里做错了?
答案 0 :(得分:0)
以前的VC决定它自己的后退按钮是什么。
所以在viewDidLoad
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back title" style:UIBarButtonItemStylePlain target:nil action:nil];
如果未设置,则后退按钮将是前一个VC的.title
。
-
在您的情况下,您应该有一些语言更改通知,以前的VC可以监听并知道更新自己的标题。
答案 1 :(得分:0)
实现此目的的一种方法是实现UINavigationControllerDelegate
并在其中设置后退栏按钮项目:
class YourViewController: UIViewController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.delegate = self
}
// MARK: - Navigation controller delegate
public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
let item = UIBarButtonItem(title: "Custom title", style: .plain, target: nil, action: nil)
viewController.navigationItem.backBarButtonItem = item
}
}
需要注意的是,这需要在推动下一个视图控制器的视图控制器中实现。因此,您将更改willShow
。
答案 2 :(得分:0)
导航堆栈中的那些视图控制器不会自动更改。