我有一个用Swift编写的iOS应用。
在这个应用程序中,我有多个变量,需要在每个ViewController中都可以访问它们。问题在于我无法在prepare(for segue:, sender:)
中传递它们,因为我正在谈论20个变量。
我尝试将它们放在名为GlobalVars
的类中,以便在初始ViewController上将数据从DB加载到变量中。在此ViewController中,这是我声明类变量的方式:
var vars: GlobalVars = GlobalVars()
然后,在viewDidLoad()
函数中,我将数据加载到类的变量中。
在其他ViewController中,我在开头声明了以下变量:
var vars: GlobalVars = LoadingViewController().vars
问题已经在LoadingViewController中开始。问题在于,显然数据没有保存到类的变量中。
在此类中,每个变量都有初始值,但空值。例如,将数组声明为[]
。
如何使每个ViewController均可访问变量?我也使用struct而不是class进行了尝试,但是效果也不好。
答案 0 :(得分:1)
方法1-全局变量(不推荐)
将它们声明为任何类之外的全局变量。
var vars: GlobalVars = GlobalVars()
方法2-共享实例
在类内将它们声明为静态变量:
class GlobalVars {
static var shared: GlobalVars = GlobalVars()
// Your variables and other stuff
}
您可以使用后跟.
运算符的类名来访问变量。
GlobalVars.shared.variable = // Store something
答案 1 :(得分:1)
全局变量不好,但共享实例(单例)也很糟糕。单例永远存在,可以在代码中的任何位置访问单例,使单元测试变得困难等。
请考虑依赖注入。
理想情况:
final class MutableVariables {
var firstVariable: String
var secondVariable: String
}
final class ViewController: UIViewController {
private var variables: MutableVariables
init(injectedDependency: MutableVariables) {
self.variables = injectedDependency
}
func doStuff() {
self.variables.firstVariable = "foo"
}
}
func startMyApp() {
let variables = MutableVariables() //keep hold of this somewhere
let viewController = ViewController(injectedDependency: variables)
present(viewController)
let anotherViewController = ViewController(injectedDependency: variables)
present(viewController)
}
但是,由于您使用的是带有剧情的情节提要:
final class ViewController: UIViewController {
private var variables: MutableVariables!
func inject(dependency: MutableVariables) {
self.variables = injectedDependency
}
func doStuff() {
self.variables.firstVariable = "foo"
}
}
final class MasterController {
let variables = MutableVariables()
func startMyApp() {
let viewController = ViewController()
present(viewController)
let anotherViewController = ViewController()
present(viewController)
}
func segueFinished(for viewController: ViewController) {
viewController.inject(dependency: self.variables)
}
}
当然,多个ViewController
直接突变同一组变量也同样有问题。考虑让每个ViewController
委派给某个父对象(即上面的MasterController
),这是唯一可以更改变量的对象。