使用 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 数据