Refre sh Storyboard viewcontroller с помощью swift iOS - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть кнопка во всех view-контроллерах для изменения языка

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()
    } 

Я унаследовал LanguageViewController во всех моих FirstViewCOntroller, SecondController, как показано ниже

class FirstViewController: LanguageViewController {

}
class SecondController: LanguageViewController {

}

Если я вызываю self.viewDidLoad (), он не может изменить язык из представления, определенного в раскадровке. Как перезагрузить раскадровку, чтобы язык во всех viewcontroller менялся, если нажата какая-либо кнопка из любого viewcontroller? Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Вы можете использовать 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.
}
0 голосов
/ 03 апреля 2020

Поправь меня, если я ошибаюсь. но я думаю, вам не нужно перезагружать все контроллеры представления. вам просто нужно обновить их, когда они отобразятся, контроллеры вида позади представленного не видны пользователю.

для этого вы можете сделать что-то вроде этого:

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 действительно ржавый.

...