代码之家  ›  专栏  ›  技术社区  ›  Ido Naveh

类变量值没有被更新

  •  0
  • Ido Naveh  · 技术社区  · 8 年前

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

    我试着把它们放在一个名为 GlobalVars

    var vars: GlobalVars = GlobalVars()
    

    然后,在 viewDidLoad()

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

    var vars: GlobalVars = LoadingViewController().vars
    

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

    [] .

    2 回复  |  直到 8 年前
        1
  •  1
  •   Rakesha Shastri    8 年前

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

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

    var vars: GlobalVars = GlobalVars()
    

    方法2-共享实例

    class GlobalVars {
        static var shared: GlobalVars = GlobalVars() 
    
        // Your variables and other stuff
    }
    

    您可以使用类名后跟 . 接线员。

    GlobalVars.shared.variable = // Store something
    
        2
  •  1
  •   sam-w    8 年前

    而是考虑依赖注入。

    理想的:

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

    ViewController 直接改变同一组变量。考虑拥有每一个 视图控制器 委托给某个父对象(即。 MasterController

    推荐文章