在这里有一些很棒的教程和用户的帮助下,我已经成功地在我的应用程序中实现了SwiftyJSON并获得了一个基本的WatchKit应用程序。我的最后一个障碍是将我的整套解析后的JSON数据传递给WatchKit,以便我可以从TableView中的单元格中进行选择,并根据一条标准提取更具体的细节。
我正在解析我的 Minion.swift 文件中的JSON数据,就像这样;
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]()
for 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
}
}
对于我的iOS应用程序,这可以很好地填充我的UITableView和后续的详细信息视图。我有像我这样的 ViewController.Swift ;
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 {
}
我已经截断了大部分代码,因为我不相信它与WatchKit相关。在WatchKit扩展中,我有这样的 InterfaceController.swift ;
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 = ???
当我运行iOS应用程序时,它会向我抛出错误"属性列表对格式无效:200(属性列表不能包含类型为' CFType'的对象)"因为我将整套JSON数据作为" minions传递。"如果我将我的NSUserDefaults键设置为" minions [0] .name"它将传递单个字符串,但传递整个数据集,以便WatchKit表允许我选择一行似乎在逃避我。
事先,我一如既往地感激不尽。
答案 0 :(得分:3)
您的Minion
课程需要实施NSCoding
。然后在视图控制器中,您需要将Minion
对象转移到NSData
对象。
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") as String
age = aDecoder.decodeObjectForKey("age") as String
height = aDecoder.decodeObjectForKey("height") as String
weight = aDecoder.decodeObjectForKey("weight") as String
}
}
在ViewController类中:
NSKeyedArchiver.setClassName("Minion", forClass: Minion.self)
defaults?.setObject(NSKeyedArchiver.archivedDataWithRootObject(minions), forKey: "minions")
如果您想从NSUserDefaults
检索数据:
if let data = defaults?.objectForKey("minions") as? NSData {
NSKeyedUnarchiver.setClass(Minion.self, forClassName: "Minion")
let minions = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! [Minion]
}