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:
- create new variable named
defaults
, store user defaults instance,let lvl1default = nsuserdefaults.standarduserdefaults() let lvl2default = nsuserdefaults.standarduserdefaults()
becomeslet defaults = nsuserdefaults.standarduserdefaults()
use new variable replacing previous
lvl1default
,lvl2default
onviewdidload
(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
Post a Comment