使用 swift iOS 刷新 Storyboard 视图控制器

Posted

技术标签:

【中文标题】使用 swift iOS 刷新 Storyboard 视图控制器【英文标题】:Refresh Storyboard viewcontroller using swift iOS 【发布时间】: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() 它无法从情节提要中定义的视图更改语言。如果单击任何视图控制器中的任何按钮,如何重新加载情节提要,以便所有视图控制器中的语言都应更改?谢谢!

【问题讨论】:

【参考方案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。

以上是关于使用 swift iOS 刷新 Storyboard 视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在带有 Swift 4 的 iOS 11 中使用带有刷新控件的 @objc?

使用 swift iOS 刷新 Storyboard 视图控制器

自定义单元格的刷新控制问题 - Swift 4 IOS 11

iOS Swift - URLSessionDataTask 在刷新时没有得到更新的 JSON 数据

如何在iOS swift中的表格视图按钮中进行拉动刷新[重复]

如何在swift ios中刷新标签栏项目