如何强制全局变量更新"?

时间:2015-04-21 14:40:16

标签: ios swift

我认为这是一个简单的问题,所以你可能会直接回答这个问题。

我有一个全局变量switchStatusIndex,(不属于任何类。):

import Foundation

//Default
var userIndex:[Int] = [0,1,2]

var userIndexForItem:[Int] = [Int]()

//Index to hold the switch status for all datatypes
var switchStatusIndex:[String] = [
        NSUserDefaults.standardUserDefaults().boolForKey("switchA").description,
        NSUserDefaults.standardUserDefaults().boolForKey("switchB").description,
        NSUserDefaults.standardUserDefaults().boolForKey("switchC").description]

ViewControllerOne 中我有一个功能:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    setupUserIndexForItem ()
    }

func setupUserIndexForItem () {
    userIndexForItem = [Int]()   //clears userIndexForItem

    for i in 0...userIndex.count-1{
        if switchStatusIndex[i] == "true"{
            userIndexForItem.append(userIndex[i])
        }
    }
}

最后我有一个带有UISwitches ex的 ViewControllerTwo

@IBOutlet var switchA: UISwitch!

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
}


override func layoutSubviews() {
    restoreSwitchesStates()
}


@IBAction func setStateSwitchA(sender: UISwitch) {
    var userdefault: NSUserDefaults = NSUserDefaults.standardUserDefaults()

    if switchA.on == true {
        userdefault.setBool(switchA!.on, forKey: "switchA")

    }else if switchA.on == false {
        userdefault.setBool(switchA!.on, forKey: "switchA")
    }
    userdefault.synchronize()
}

func restoreSwitchesStates() {
    switchA!.on = NSUserDefaults.standardUserDefaults().boolForKey("switchA")
}

当我将开关拨到.on时,它会将NSUserdefault更新为“true”。 但是,当我返回ViewControllerOne时,setupUserIndexForItem不会反映此更改。这是因为switchStatusIndex不会更新 问题:如何强制全局变量“更新”?

2 个答案:

答案 0 :(得分:0)

您可以通过多种方式执行此操作。您可以通过放入Appdelegate将switchStatusArray作为全局,或者您可以使用nsnotifiation或者您可以进行委托。

如果使用通知,则首先使方法初始化该数组并在通知方法中用作选择器。

NSNotificationCenter.defaultCenter().addObserver(
self,
selector: "intializeSwitcharrayMethod:",
name:"intializeSwitcharray" object: nil)

     @objc func  intializeSwitcharrayMethod(notification: NSNotification){     
    //do stuff

         Self.intializeSwitcharraywithUserdefaults()
     }


  func intializeSwitcharraywithUserdefaults()
 { 
    // your code of array intialization
  }

您也可以从viewdidload调用intializeSwitcharraywithUserdefaults()。

答案 1 :(得分:0)

如果我正确理解了您的代码,那么每次从switchStatusIndex方法中访问该数组时,您都希望更新viewWillAppear数组的内容。但这不会发生,因为switchStatusIndex只设置了一次而且再也没有改变过。也许您打算将switchStatusIndex定义为计算属性或由闭包初始化的属性,以便每次访问它时都会发生一些事情(使用{{1}中的值更新数组内容})。