【问题标题】:Refresh Storyboard viewcontroller using swift iOS使用 swift iOS 刷新 Storyboard 视图控制器
【发布时间】:2020-04-02 15:37:34
【问题描述】:

我在所有视图控制器中都有按钮来更改语言

LanguageViewController.swift

class LanguageViewController: UIViewController {
     @IBAction func actionChange(_ sender: Any) {
          L102Language.currentAppleLanguage()
          L102Language.setAppleLAnguageTo(lang: "en")
          // below code to refresh storyboard
          self.viewDidLoad()
     }
}

L102Language.swift

class func currentAppleLanguage() -> String{
        let userdef = UserDefaults.standard
        let langArray = userdef.object(forKey: APPLE_LANGUAGE_KEY) as! NSArray
        let current = langArray.firstObject as! String
        let endIndex = current.startIndex
        let currentWithoutLocale = current.substring(to: current.index(endIndex, offsetBy: 2))
        return currentWithoutLocale
    }

    /// set @lang to be the first in Applelanguages list
    class func setAppleLAnguageTo(lang: String) {
        let userdef = UserDefaults.standard
        userdef.set([lang,currentAppleLanguage()], forKey: APPLE_LANGUAGE_KEY)
        userdef.synchronize()
    } 

我在我所有的 FirstViewCONtroller、SecondController 中都继承了 LanguageViewController,如下所示

class FirstViewController: LanguageViewController {

}
class SecondController: LanguageViewController {

}

如果我调用 self.viewDidLoad() 它无法从情节提要中定义的视图更改语言。如果单击任何视图控制器中的任何按钮,如何重新加载情节提要,以便所有视图控制器中的语言都应更改?谢谢!

【问题讨论】:

    标签: ios swift uiviewcontroller localization viewcontroller


    【解决方案1】:

    您可以使用 NotificationCenter 重新加载视图控制器的内容,这也会重新加载不可见的视图控制器的内容。

    extension Notification.Name {
        static let didChangeLanguage = Notification.Name("didChangeLanguage")
    }
    
    override func viewDidLoad() {
        //Add a listener
        NotificationCenter.default.addObserver(self, selector: #selector(onDidChangeLanguage(_:)), name: .didChangeLanguage, object: nil)
    
    }
    
    @IBAction func actionChange(_ sender: Any) {
        L102Language.currentAppleLanguage()
        L102Language.setAppleLAnguageTo(lang: "en")
        // Notify about the change.
        NotificationCenter.default.post(name: .didChangeLanguage, object: self, userInfo: nil)
    }
    
    @objc func onDidChangeLanguage(_ notification:Notification) {
        // reload content using selected language.
    }
    

    【讨论】:

      【解决方案2】:

      如果我错了,请纠正我。但我认为您不需要重新加载所有视图控制器。您只需要在它们显示时更新它们,视图控制器在呈现的控制器后面对用户不可见。

      为此,您可以执行以下操作:

      var currentLanguage = ""
      
      override func viewDidLoad() {
          currentLanguage = currentAppleLanguage()
          loadContentForLanguage(currentLanguage)
      }
      
      override func viewWillAppear(_ animated: Bool) {
          super.viewWillAppear(animated)
      
          // this will be executed every time this sceen gets display
          if currentLanguage != currentAppleLanguage() {
                currentLanguage = currentAppleLanguage()
                loadContentForLanguage(currentLanguage)
          }
      }
      
      func loadContentForLanguage(_ currentLanguage: String) {
           //here it goes whatever you currently have in viewDidLoad
      }
      

      如果这不能编译,我很抱歉,我的 swift 真的生锈了。

      【讨论】:

      • 不!按下 actionChange() 按钮时,我需要更改语言。它附加到所有 ViewControllers。
      猜你喜欢
      • 2016-07-28
      • 2014-10-09
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多