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

Popular posts from this blog

shopping cart - Page redirect not working PHP -

php - How to modify a menu to show sub-menus -

python - Installing PyDev in eclipse is failed -