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

问题描述:

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

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不会更新为新的标题值。我在哪里做错了?

+0

你应该改变每个视图控制器的'title'属性。 – rmaddy

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

如果没有设置,那么后退按钮将是以前的VC的.titleviewDidLoad

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back title" style:UIBarButtonItemStylePlain target:nil action:nil]; 

所以设置这个在previousVC。

-

在你的情况,你应该有某种语言的变更通知,以前的VC可以监听并知道更新了自己的冠军。

做到这一点,是落实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 
    } 
} 

一个需要注意的是,这需要在其推动下一个视图的视图控制器来实现控制器。所以你会改变视图控制器的back bar按钮项目willShow

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

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

我试过你的方法,并且调用观察者函数。但是,标题更改声明不起作用(self.title =“新标题”或navigationController?.title =“新标题”)。现有的标题依然存在。 – user30646

+0

请尝试navigationItem.title =“hello” –