2016-08-08 32 views
-2

我開始迅速,我正在做一個應用程序(一個小遊戲)。 級別2,...的按鈕未啓用,因爲用戶在用戶安裝應用程序時尚未贏得1級。那麼我希望每當用戶贏得關卡時都啓用這些按鈕。我在一個文件中寫道的:在swift代碼中啓用按鈕

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 1,該level2 button是ENA流血,但是當我添加

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

當我贏得level1,將blvl2blvl3被啓用,我不知道爲什麼

我想這是因爲我保存所有blvl但我的數據我不確定。 預先感謝,真的很抱歉我的英語,這不是我的第一語言。

+0

檢查故事板,是否所有按鈕在初始化期間都被禁用。 – MShah

+0

他們都被禁用.. –

回答

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中是錯誤的。

1

的問題是,因爲你在呼喚NSUserDefaults.standardUserDefaults()兩次,爲了解決它,你可以:

  1. 創建一個名爲defaults新的變量和存儲用戶的默認實例,所以這let lvl1Default = NSUserDefaults.standardUserDefaults() let lvl2Default = NSUserDefaults.standardUserDefaults()成爲let defaults = NSUserDefaults.standardUserDefaults()
  2. 使用新的變量替換上viewDidLoad以前lvl1Defaultlvl2Default(不要忘了超級調用)

    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年8月10日評論: 在我第一次嘗試提供一個回答你的問題,我試圖找出問題,併成功地我設法重新創建它,而不考慮對lvl1 class的代碼。由於這沒有解決你的問題,我第二次嘗試考慮nextlvl功能。

在此功能上,還有另一個NSUserDefaults.standardUserDefaults()調用。我要做的第一件事就是將'默認值'作爲一個全局變量(以前解釋過)保持不變,以便您可以隨處訪問它。 (如果你需要更多關於這方面的信息,你可以查看這個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是一個布爾類型的CA不是null,而Bool!表示隱式解開的布爾類型,Bool?表示需要解開布爾類型。

如果您想了解更多關於包裝,檢查​​參考

您還可以使用defaults.boolForKey("lvlWon2")它給你的結果作爲布爾型,避免了鑄造。

+0

我取代了默認的所有lvl1Deafault和lvl2Default .. 但是當贏得1級時,blvl1,blvl2和blvl3被啓用。我不想讓blvl3啓用,因爲「我還沒贏得level2」。 –

+0

@Matt Jacquet這個步驟解決了我所做的測試中的問題,但是我在'levelList'視圖控制器上放置了'lvlWon1 = true'邏輯。如果這沒有解決問題,也許問題是'nextlvl'函數,但我不太明白 –

+0

我真的不明白。我用levellist文件和lvl1文件中的'defaults'替換了所有'lvlDefault',但是當我完成lvl 1時blvl3仍然啓用。我給你我所有關於這些函數的代碼。 –