gpt4 book ai didi

swift - 在 NSUserDefaults 中将多个对象传递给 WatchKit

转载 作者:搜寻专家 更新时间:2023-11-01 06:46:42 25 4
gpt4 key购买 nike

在一些很棒的教程和用户的帮助下,我已经成功地在我的应用程序中实现了 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 和后续的详细信息 View 。我有这样的 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 表允许我选择一行似乎在逃避我。

一如既往,我非常感激。

最佳答案

您的Minion 类需要实现NSCoding。然后在您的 View Controller 中,您需要将 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]
}

关于swift - 在 NSUserDefaults 中将多个对象传递给 WatchKit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29856770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com