swift 代码中的启用按钮
enabling button in swift code
我开始 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!
}
}
}
这个在另一个文件中:
class 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 1
时,level2 button
被启用,但是当我添加
var lvlWon2: Bool = false {
didSet {
blvl3?.enabled = lvlWon2
}
}
当我赢得level1
时,blvl2
和blvl3
被启用,我不知道为什么
我想是因为我保存了所有 blvl
的数据,但我不确定。
提前致谢,真的很抱歉我的英语不好,这不是我的母语。
问题是因为您调用了 NSUserDefaults.standardUserDefaults()
两次,为了修复它您可以:
- 创建一个名为
defaults
的新变量并存储用户默认实例,以便此 let lvl1Default = NSUserDefaults.standardUserDefaults()
let lvl2Default = NSUserDefaults.standardUserDefaults()
变为 let defaults = NSUserDefaults.standardUserDefaults()
在 viewDidLoad
上使用那个新变量替换之前的 lvl1Default
和 lvl2Default
(不要忘记调用 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()
调用。我要做的第一件事是将 'defaults' 常量(前面解释过)作为全局变量,以便您可以在任何地方访问它。 (如果您需要更多相关信息,可以查看此 answer)
我注意到的另一件事是对 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
是不能为 null 的布尔类型,而 Bool!
表示隐式展开的布尔类型,Bool?
表示需要展开的布尔类型。
如果您想阅读有关包装器的更多信息,请查看 The Swift Programming Language 参考资料
您也可以使用 defaults.boolForKey("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错误。
我开始 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!
}
}
}
这个在另一个文件中:
class 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 1
时,level2 button
被启用,但是当我添加
var lvlWon2: Bool = false {
didSet {
blvl3?.enabled = lvlWon2
}
}
当我赢得level1
时,blvl2
和blvl3
被启用,我不知道为什么
我想是因为我保存了所有 blvl
的数据,但我不确定。
提前致谢,真的很抱歉我的英语不好,这不是我的母语。
问题是因为您调用了 NSUserDefaults.standardUserDefaults()
两次,为了修复它您可以:
- 创建一个名为
defaults
的新变量并存储用户默认实例,以便此let lvl1Default = NSUserDefaults.standardUserDefaults() let lvl2Default = NSUserDefaults.standardUserDefaults()
变为let defaults = NSUserDefaults.standardUserDefaults()
在
viewDidLoad
上使用那个新变量替换之前的lvl1Default
和lvl2Default
(不要忘记调用 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()
调用。我要做的第一件事是将 'defaults' 常量(前面解释过)作为全局变量,以便您可以在任何地方访问它。 (如果您需要更多相关信息,可以查看此 answer)
我注意到的另一件事是对 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
是不能为 null 的布尔类型,而 Bool!
表示隐式展开的布尔类型,Bool?
表示需要展开的布尔类型。
如果您想阅读有关包装器的更多信息,请查看 The Swift Programming Language 参考资料
您也可以使用 defaults.boolForKey("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错误。