swift - Passing Multiple Objects To WatchKit In A NSUserDefaults -
with of great tutorials , users here, i've had success implementing swiftyjson in app , getting basic watchkit app built alongside. last hurdle pass getting whole set of parsed json data passed watchkit, allow me choose cell in tableview , pull more specific detail on piece of criteria.
i'm parsing json data in minion.swift file, so;
import uikit class minion { var name: string? var age: string? var height: string? var weight: string? class func fetchminiondata() -> [minion] { let dataurl = nsurl(string: "http://myurl/json/") var dataerror: nserror? let data = nsdata(contentsofurl: dataurl!, options: nsdatareadingoptions.datareadingmappedifsafe, error: &dataerror) let minionjson = jsonvalue(data) var minions = [minion]() miniondictionary in minionjson { minions.append(minion(miniondetails: miniondictionary)) } return minions } init(miniondetails: jsonvalue) { name = miniondetails["san"].string age = miniondetails["age"].string height = miniondetails["height"].string weight = miniondetails["free"].string } } for ios app, working populate uitableview , subsequent detail view. have viewcontroller.swift so;
import uikit class viewcontroller: uitableviewcontroller { let minions: [minion] required init(coder adecoder: nscoder!) { minions = minion.fetchminiondata() super.init(coder: adecoder) } override func viewdidload() { super.viewdidload() let defaults = nsuserdefaults(suitename: "group.com.mygroup.data") let key = "dashboarddata" defaults?.setobject(minions, forkey: key) defaults?.synchronize() } // mark: table view data source override func tableview(tableview: uitableview, numberofrowsinsection section: int) -> int { } i've truncated of code don't believe it's relevant watchkit. in watchkit extension, have interfacecontroller.swift so;
import watchkit class interfacecontroller: wkinterfacecontroller { @iboutlet weak var miniontable: wkinterfacetable! let defaults = nsuserdefaults(suitename: "group.com.mygroup.data") var dashboarddata: string? { defaults?.synchronize() return defaults?.stringforkey("dashboarddata") } let minions = ??? when run ios app, throws me error "property list invalid format: 200 (property lists cannot contain objects of type 'cftype')" because passing whole set of json data "minions." if set nsuserdefaults key "minions[0].name" pass single string, passing whole set of data watchkit table can allow me choose row seems evading me.
in advance, always, grateful.
your minion class need implement nscoding. in view controller need transfer minion object nsdata object.
class minion: nsobject, nscoding { ..... init(coder adecoder: nscoder!) { acoder.encodeobject(name, forkey: "name") acoder.encodeobject(age, forkey: "age") acoder.encodeobject(height, forkey: "height") acoder.encodeobject(weight, forkey: "weight") } func encodewithcoder(acoder: nscoder) { name = adecoder.decodeobjectforkey("name") string age = adecoder.decodeobjectforkey("age") string height = adecoder.decodeobjectforkey("height") string weight = adecoder.decodeobjectforkey("weight") string } } in viewcontroller class:
nskeyedarchiver.setclassname("minion", forclass: minion.self) defaults?.setobject(nskeyedarchiver.archiveddatawithrootobject(minions), forkey: "minions") if want retrieve data nsuserdefaults:
if let data = defaults?.objectforkey("minions") as? nsdata { nskeyedunarchiver.setclass(minion.self, forclassname: "minion") let minions = nskeyedunarchiver.unarchiveobjectwithdata(data) as! [minion] }
Comments
Post a Comment