ios - enabling button in swift code -


i begin swift , i'm making app ( little game). buttons of levels 2,... not enabled because user dont yet win level 1 when user install application. want these buttons enabled everytime user won level. wrote in file:

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!         }      } } 

and in other file:

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() } 

//my problem work finely when wrote:

var lvlwon1: bool = false {     didset {         blvl2?.enabled = lvlwon1      } } 

so when won lvl 1, level2 button enabled, when add

var lvlwon2: bool = false {     didset {         blvl3?.enabled = lvlwon2     } } 

when win level1, blvl2 , blvl3 enabled, don't know why

i think it's because save data of blvl i'm not sure. in advance , sorry english, it's not first language.

the problem because calling nsuserdefaults.standarduserdefaults() twice, in order fix could:

  1. create new variable named defaults , store user defaults instance, let lvl1default = nsuserdefaults.standarduserdefaults() let lvl2default = nsuserdefaults.standarduserdefaults() becomes let defaults = nsuserdefaults.standarduserdefaults()
  2. use new variable replacing previous lvl1default , lvl2default on viewdidload (and not forget call 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 }         } 

edit after 2016-08-10 comment: on first attempt provide answer problem, tried isolate problem , succesfully managed recreate without considering code on lvl1 class. since did not solved issue, made second attempt taking nextlvl function in consideration.

on function, there nsuserdefaults.standarduserdefaults() call. first thing make 'defaults' constant (explained previously) global variable can access everywhere. (in case need more info this, check answer) thing noticed call synchronize() deprecated.

so, after moving defaults constant somewhere global, think meant on nextlvl function should be:

@ibaction func nextlvl(sender: uibutton) {     lvlwon1 = true     defaults.setbool(true, forkey: "lvlwon1"); } 

edit 2: side note: when casting lvlwon2 = defaults.valueforkey("lvlwon2") as! bool! not need place ! in type, in as! bool! need as! bool

bool boolean type cannot null whereas bool! means boolean type implicitly unwrapped , bool? means boolean type needs unwrapped.

if wish read more wrappers, check the swift programming language reference

you can use defaults.boolforkey("lvlwon2") gives result bool type , avoid casting.


Comments