-2

我开始迅速,我正在制作一个应用程序(一个小游戏)。级别 2,... 的按钮未启用,因为用户在安装应用程序时尚未赢得级别 1。然后我希望每次用户赢得关卡时都启用这些按钮。我在一个文件中写了这个:

class levelList: UIViewController {
    @IBOutlet var blvl1: UIButton!
    @IBOutlet var blvl2: UIButton!
    @IBOutlet var blvl3: UIButton!

    var lvlWon1: Bool = false {
        didSet {
            blvl2?.enabled = lvlWon1

        }
    }

    var lvlWon2: Bool = false {
        didSet {
            blvl3?.enabled = lvlWon2
        }
    }
    let lvl1Default = NSUserDefaults.standardUserDefaults()
    let lvl2Default = NSUserDefaults.standardUserDefaults()


    override func viewDidLoad() {

        if (lvl1Default.objectForKey("lvlWon1") != nil){
            lvl1Default.setBool(true, forKey: "lvlWon1")
            lvlWon1 = lvl1Default.valueForKey("lvlWon1") as! Bool!
        }
        else{
            lvl1Default.setBool(false, forKey: "lvlWon1")
            lvlWon1 = lvl1Default.valueForKey("lvlWon1") as! Bool!
        }

        //
        if (lvl2Default.objectForKey("lvlWon2") != nil){
            lvl2Default.setBool(true, forKey: "lvlWon2")
            lvlWon2 = lvl2Default.valueForKey("lvlWon2") as! Bool!
        }
        else{
            lvl2Default.setBool(false, forKey: "lvlWon2")
            lvlWon2 = lvl2Default.valueForKey("lvlWon2") as! Bool!
        }

    }
}

这在另一个文件中:

等级 lvl1: UIViewController {

var levelList = levelList()
@IBOutlet var bNext: UIButton!
@IBAction func nextlvl(sender: UIButton) {
    levelList.lvlWon1 = true
    levelList.lvlWon1 = levelList.lvl1Default.valueForKey("lvlWon1") as! Bool!
    let lvl1Default = NSUserDefaults.standardUserDefaults()
    lvl1Default.setValue(listeNiveaux.lvlWon1, forKey:"lvlWon1")
    lvl1Default.synchronize()
}

//我的问题是当我写的时候一切都很好:

var lvlWon1: Bool = false {
    didSet {
        blvl2?.enabled = lvlWon1

    }
}

所以当我赢得比赛时lvl 1level2 button启用了,但是当我添加

var lvlWon2: Bool = false {
    didSet {
        blvl3?.enabled = lvlWon2
    }
}

当我赢得level1,blvl2blvl3启用时,我不知道为什么

我认为这是因为我保存了所有人的数据,blvl但我不确定。在此先感谢,真的很抱歉我的英语,这不是我的第一语言。

4

2 回答 2

1

问题是因为您调用NSUserDefaults.standardUserDefaults()了两次,为了解决它,您可以:

  1. 创建一个名为defaults并存储用户默认实例的新变量,这样let lvl1Default = NSUserDefaults.standardUserDefaults() let lvl2Default = NSUserDefaults.standardUserDefaults()就变成let defaults = NSUserDefaults.standardUserDefaults()
  2. 使用该新变量替换以前的lvl1Defaultlvl2Defaulton viewDidLoad(并且不要忘记调用 super)

    override func viewDidLoad() {
    super.viewDidLoad()
    
    if (defaults.objectForKey("lvlWon1") != nil){
        defaults.setBool(true, forKey: "lvlWon1")
        lvlWon1 = defaults.valueForKey("lvlWon1") as! Bool
    }
    else{
        defaults.setBool(false, forKey: "lvlWon1")
        lvlWon1 = defaults.valueForKey("lvlWon1") as! Bool
    }
    
    //
    if (defaults.objectForKey("lvlWon2") != nil){
        defaults.setBool(true, forKey: "lvlWon2")
        lvlWon2 = defaults.valueForKey("lvlWon2") as! Bool
    }
    else{
        defaults.setBool(false, forKey: "lvlWon2")
        lvlWon2 = defaults.valueForKey("lvlWon2") as! Bool
    }        
    }
    

在 2016-08-10 评论后编辑:在我第一次尝试为您的问题提供答案时,我试图隔离问题,并且我成功地设法重新创建它,而无需考虑lvl1 class. 由于这并没有解决您的问题,因此我在考虑该nextlvl功能的情况下进行了第二次尝试。

在这个函数上,还有另一个NSUserDefaults.standardUserDefaults()调用。我要做的第一件事是将“默认值”常量(前面解释过)作为全局变量,以便您可以在任何地方访问它。(如果您需要有关此的更多信息,您可以查看此答案)我注意到的另一件事synchronize()是不推荐使用的调用。

因此,在将默认常量移动到全局某个位置之后,我认为您在nextlvl函数上要做的事情应该是:

@IBAction func nextlvl(sender: UIButton) {
    lvlWon1 = true
    defaults.setBool(true, forKey: "lvlWon1");
}

编辑2:作为旁注:当您进行投射时,lvlWon2 = defaults.valueForKey("lvlWon2") as! Bool!您不需要放置!在类型中,因为as! Bool!您只需要as! Bool

Bool是一个不能为空Bool!的布尔类型,而意味着一个隐式解包的布尔类型,Bool?意味着一个布尔类型需要被解包。

如果您想了解更多关于包装器的信息,请查看The Swift Programming Language参考

您还可以使用defaults.boolForKey("lvlWon2")which 为您提供 Bool 类型的结果并避免强制转换。

于 2016-08-08T19:41:09.540 回答
0

我终于找到了解决方案:

 import UIKit

class ViewController: UIViewController {

 var defaults = NSUserDefaults.standardUserDefaults()

 @IBOutlet weak var startSecondLevelButton: UIButton!

 override func viewDidLoad() {
super.viewDidLoad()

self.checkLevelsStatuses()
    }

 func checkLevelsStatuses() {

startSecondLevelButton.enabled = false

if let lvlWon1 = defaults.objectForKey("lvlWon1") as? Bool {
    // if true - level finished
    if (lvlWon1) {
        startSecondLevelButton.enabled = true
    }
}else {
    defaults.setBool(false, forKey: "lvlWon1")
}

if let lvlWon2 = defaults.objectForKey("lvlWon2") as? Bool {

} else {
    defaults.setBool(false, forKey: "lvlWon2")
}

}

那是因为 viewDidLoad 是错误的。

于 2016-08-29T20:39:30.823 回答