Ios swift代码中的启用按钮
我从swift开始,我正在制作一个应用程序(一个小游戏)。 级别2的按钮,。。。未启用,因为用户在安装应用程序时尚未获得级别1。然后,我希望每次用户赢得关卡时都启用这些按钮。我在一个文件中写道: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
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)
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")
}