更改将您带到上一个视图控制器的按钮的标题值

时间:2017-10-06 04:33:51

标签: ios swift uinavigationcontroller

我在导航控制器中嵌入了多个视图控制器。我有一个选项可以更改用户界面的语言。当用户选择法语时,用户界面应使用法语自行更新。除了将用户带回到前一个视图控制器的按钮之外,所有元素都按照我的预期更新为法语(如屏幕截图所示 - “事件列表”)。

enter image description here

这是我调用更新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没有使用新标题值更新。我哪里做错了?

3 个答案:

答案 0 :(得分:0)

以前的VC决定它自己的后退按钮是什么。

所以在viewDidLoad

中的previousVC上设置它
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)

导航堆栈中的那些视图控制器不会自动更改。

  • 因此,您必须使用通知中心并将观察者添加到以前的视图控制器,并在调用时使用所选语言更改导航栏的标题。
  • 当语言发生变化时,您必须发布更改。
  • 然后它会将标题更改为法语,所以后退按钮会 变化。