返回 UINavigationController 时未调用 viewWillAppear

viewWillAppear not called when going back on a UINavigationController

我调用了一些代码来更改导航控制器内 viewcontroller 的 viewWillAppear 部分中的语言。

当我点击后退按钮时,语言更改没有发生,即使我在 viewWillAppear 中有它的代码。它唯一一次切换是当我一路返回到原始屏幕然后开始向前移动时它发生了变化。有什么方法可以让 viewWillAppear 中的函数正常工作吗?

这是我的代码,我正在使用语言更改 pod:

  //MARK: Language change

  //used to change language text for imediate screens
  func setText(){
    locationsLabel.text = "Locations".localized()
    languageLabel.text = "Languages".localized()
    termsOfUseLabel.text = "Terms of Use".localized()
    privacyPolicyLabel.text = "Privacy Policy".localized()
    pushNotificationsLabel.text = "Push Notifications".localized()
    contactUsLabel.text = "Contact Us".localized()
  }


  // Changes text to current language
  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "setText", name: LCLLanguageChangeNotification, object: nil)
  }

  // Remove the LCLLanguageChangeNotification on viewWillDisappear
  override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    NSNotificationCenter.defaultCenter().removeObserver(self)
  }

实现导航控制器委托方法

navigationController:willShowViewController:animated:
navigationController:didShowViewController:animated:

viewWillAppear方法只是添加一个通知观察者。观察者在 viewWillDisappear 中被移除。这意味着 setText 仅当 LCLLanguageChangeNotification 通知被发送 而视图可见 时才会被调用。

由于导航行为,一旦视图离开屏幕,更新就会停止。

为了保证文字更新,还需要在viewWillAppear里面调用setText:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    setText()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "setText", name: LCLLanguageChangeNotification, object: nil)
}

我创建了这个小 class 来解决这个问题。 只需将它设置为您的导航控制器的委托,并在您的视图控制器中实现简单的一两个方法 - 当视图即将显示或已经通过 NavigationController

显示时将被调用

Here's the GIST showing the code