class AddElementVC: UIViewController {
// textfields and some other functions are defined here
@IBAction func addElement(sender: UIBarButtonItem) {
let newElement = Element(/* properties are defined here */)
var theDict = NSUserDefaults.standardUserDefaults().dictionaryForKey(tableViewData) as [String: [Element]]
if var theArray = theDict[newElement.someProperty] {
theArray += newElement
theDict[newElement.someProperty] = elementArray
} else{
theDict[newElement.someProperty] = [newElement]
}
NSUserDefaults.standardUserDefaults().setObject(theDict, forKey: tableViewData)
}
}
上面代码的解释:
我的 tableView-app 从 [String: [Element]] 类型的字典(Element 是一个自定义类)接收数据,该字典是从 userDefaults 加载的。在第二个 viewController 中,您可以填写一些文本字段,最后按 UIBarButtonItem。根据 textFields 的数据,创建“Element”类的新实例,并将其添加到“theDict”中“newElement”属性之一的键处。当我使用控制台输出检查它时,所有这些都工作正常,但我无法最终将编辑后的字典保存在 userDefaults 中。没有语法错误,但是当我使用该应用程序并尝试通过第二个 viewController 将另一个元素添加到字典时,会显示以下错误:
错误信息:
NSForwarding:警告:类“_TtC12myApp7Element”的对象 0xdcb002c 未实现 methodSignatureForSelector:-- 前方有麻烦
研究并没有帮助我理解错误消息。
EDIT
import Foundation
class Element: NSCoding {
enum State: String {
case state1 = "state1"
case state2 = "state2"
}
let state: State
// some more properties
init(state: String /* something more */ ){
self.state = State.fromRaw(state)!
// something more
}
init(coder aDecoder: NSCoder!) {
self.state = aDecoder.decodeObjectForKey("state") // displays error: 'AnyObject' is not convertible to 'Element.State'
// something more
}
func encodeWithCoder(aCoder: NSCoder!) {
aCoder.encodeObject(self.state, forKey: "state") // displays error: Extra Argument 'forKey' in call
// something more
}
}
来自NSUserDefaults 文档:
value参数只能是属性列表对象:NSData,
NSString、NSNumber、NSDate、NSArray 或 NSDictionary。对于 NSArray 和
NSDictionary 对象,其内容必须是属性列表对象。
看“什么是财产清单?” in 属性列表编程指南.
您不能存储包含以下元素的字典Element
在字典里。
一种选择是确保Element
实施NSCoding协议然后使用NSKeyedArchiver将字典转换为 NSData:
// Storing the dictionary
var data = NSKeyedArchiver.archivedDataWithRootObject(theDict)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: tableViewData)
// Retrieving the dictionary
var outData = NSUserDefaults.standardUserDefaults().dataForKey(tableViewData)
var dict = NSKeyedUnarchiver.unarchiveObjectWithData(outData)
你的协议实现看起来像这样:
init(coder aDecoder: NSCoder!) {
self.state = State.fromRaw(aDecoder.decodeObjectForKey("state") as String)
}
func encodeWithCoder(aCoder: NSCoder!) {
aCoder.encodeObject(self.state.toRaw(), forKey: "state")
}
您无法存储枚举,但可以存储它的原始表示形式,即字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)