【问题标题】:Class variables values aren't being updated类变量值未更新
【发布时间】:2018-08-16 10:57:47
【问题描述】:

我有一个用 Swift 编写的 iOS 应用。
在这个应用程序中,我有多个变量,我需要它们在每个 ViewController 中都可以访问。问题是我不能在 prepare(for segue:, sender:) 中传递它们,因为我说的是 20 个变量。

我尝试将它们放在一个名为 GlobalVars 的类中,以便在初始 ViewController 上将数据从 DB 加载到变量中。在这个 ViewController 中,这就是我声明类变量的方式:

var vars: GlobalVars = GlobalVars()

然后,在viewDidLoad() 函数中,我将数据加载到类的变量中。

在其他 ViewControllers 中,我在开头声明了以下变量:

var vars: GlobalVars = LoadingViewController().vars

问题已经在 LoadingViewController 中开始了。问题是数据显然没有保存到类的变量中。

在这个类中,每个变量都有初始值,但为空。例如,数组声明为[]

如何让每个 ViewController 都可以访问变量?我也试过用 struct 而不是 class,但效果也不太好。

【问题讨论】:

  • LoadingViewController().vars 它不是你的视图控制器的同一个实例
  • 只需将你的 20 个变量添加到单个对象中并传递它,这样会更好吗?
  • 它被称为GlobalVars 的事实应该告诉你这是一个坏主意。 @Tj3n 是对的 - 创建一个结构并在视图控制器之间传递它。
  • 不过,如果您希望更改反映在每个类中,最好使用单例或全局变量或 db,我认为 OP 已经在使用 db,但他如何使用它似乎是错误的,只需在每个类中再次获取数据

标签: ios swift class struct


【解决方案1】:

方法 1 - 全局变量(不推荐)

将它们声明为任何类之外的全局变量。

var vars: GlobalVars = GlobalVars()

方法 2 - 共享实例

在类中将它们声明为静态变量:

class GlobalVars {
    static var shared: GlobalVars = GlobalVars() 

    // Your variables and other stuff
}

您可以使用类名后跟. 运算符来访问变量。

GlobalVars.shared.variable = // Store something

【讨论】:

  • 你不应该建议使用全局变量
  • @LeoDabus 我知道这很糟糕。但这是一个可能的解决方案。这就是我列出它的原因。我已经编辑了答案以表明不推荐。
  • 关于您的第二种方法,您应该只创建一个共享静态实例。你应该看看 Cocoa Design Pattern "singleton" developer.apple.com/documentation/swift/cocoa_design_patterns/…
  • 我能用这种方式更新变量的值吗?
  • @RakeshaShastri 只是将 Ashley 的 cmets 标记为不友善和不友好。他们需要更多的礼貌来表达他们的观点。我们都在努力建立一个可以犯错和学习的社区,不要为你的努力感到遗憾
【解决方案2】:

全局变量不好,但共享实例(单例)也不好。单身人士永远存在,可以从代码中的任何地方访问,使单元测试变得困难等等。

请考虑依赖注入。

理想情况下:

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

但是由于您使用的是带有 segue 的情节提要:

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

当然,多个ViewControllers 直接变异同一组变量也是有问题的。考虑让每个ViewController 委托给某个父对象(即上面的MasterController),这是唯一能够更改变量的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2019-05-02
    • 2020-11-01
    相关资源
    最近更新 更多