Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios swift代码中的启用按钮_Ios_Swift_Save_Boolean_Didset - Fatal编程技术网

Ios swift代码中的启用按钮

Ios swift代码中的启用按钮,ios,swift,save,boolean,didset,Ios,Swift,Save,Boolean,Didset,我从swift开始,我正在制作一个应用程序(一个小游戏)。 级别2的按钮,。。。未启用,因为用户在安装应用程序时尚未获得级别1。然后,我希望每次用户赢得关卡时都启用这些按钮。我在一个文件中写道: class levelList: UIViewController { @IBOutlet var blvl1: UIButton! @IBOutlet var blvl2: UIButton! @IBOutlet var blvl3: UIButton! var lv

我从swift开始,我正在制作一个应用程序(一个小游戏)。 级别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

    }
}
因此,当我赢得
1级
时,
level2按钮
被启用,但当我添加

var lvlWon2: Bool = false {
    didSet {
        blvl3?.enabled = lvlWon2
    }
}
当我赢得
level1
时,启用了
blvl2
blvl3
,我不知道为什么

我想这是因为我保存了所有
blvl
的数据,但我不确定。
提前感谢并为我的英语感到抱歉,它不是我的第一语言。

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

  • 创建一个名为
    defaults
    的新变量,并存储用户默认值实例,以便此
    让lvl1Default=NSUserDefaults.standardUserDefaults()
    让lvl2Default=NSUserDefaults.standardUserDefaults()
    变为
    let defaults=NSUserDefaults.standardUserDefaults()
  • viewDidLoad
    上使用该新变量替换先前的
    lvl1Default
    lvl2Default
    (不要忘记调用super)

  • 2016年8月10日后编辑评论: 在我第一次尝试为您的问题提供答案时,我尝试隔离该问题,并成功地在不考虑
    lvl1类
    上的代码的情况下重新创建了该问题。由于这没有解决您的问题,因此我再次尝试考虑
    nextlvl
    函数

    在这个函数上,还有另一个
    NSUserDefaults.standardUserDefaults()
    调用。我要做的第一件事是将“defaults”作为全局变量设置为常量(前面已经解释过),以便您可以在任何地方访问它。(如果您需要有关此的更多信息,可以选中此项) 我注意到的另一件事是对
    synchronize()
    的调用,该调用已被弃用

    因此,在将默认值常量移动到全局某个位置后,我认为您打算在
    nextlvl
    函数上执行的操作应该是:

    @IBAction func nextlvl(sender: UIButton) {
        lvlWon1 = true
        defaults.setBool(true, forKey: "lvlWon1");
    }
    
    编辑2: 作为旁注: 当您将
    lvlWon2=defaults.valueForKey(“lvlWon2”)强制转换为!Bool!
    时,您不需要像在
    as!Bool!
    中那样在类型中放置
    ,您只需要
    as!Bool

    Bool
    是不能为null的布尔类型,而
    Bool!
    表示隐式展开的布尔类型,
    Bool?
    表示需要展开布尔类型

    如果您想阅读更多关于包装器的内容,请查看参考资料


    您还可以使用
    defaults.boolforky(“lvlWon2”)
    将结果作为Bool类型提供,并避免强制转换。

    我终于找到了解决方案:

     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错误。

    检查序列图像板,是否在初始化期间禁用了所有按钮。它们都已禁用。我默认替换了所有LVL1DEADAFULT和lvl2Default。。但当赢得1级时,blvl1、blvl2和blvl3将启用。我不希望blvl3被启用,因为“我还没有赢得Level 2”。@Matt Jacquet此步骤解决了我在测试中遇到的问题,但是我将
    lvlWon1=true
    逻辑放在
    levelList
    视图控制器上。如果这没有解决问题,可能问题出在
    nextlvl
    函数上,但我不太理解,我真的不理解。我将levelList文件和lvl1文件中的所有
    lvlDefault
    替换为
    defaults
    ,但当我完成lvl1时,blvl3仍然启用。我给了你我所有关于这些函数的代码。我只是理解,你说“我把
    lvlWon1=true
    逻辑放在了levelList viewController上”你的意思是
    blvl1
    enabled?在看到你的答案之前,我注意到所有问题都来自viewdiload的代码。我想这是因为我写了
    }else{defaults.setBool(false,forKey:“lvlWon1”)lvlWon1=defaults.valueForKey(“lvlWon1”)as!Bool}
    就像当
    defaults==nil
    时,它等于false。。这会改变你的答案吗?
     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")
    }