【发布时间】:2014-08-03 22:42:34
【问题描述】:
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”的新实例并将其添加到“newElement”属性之一的键处的“theDict”中。当我使用控制台输出检查它时,一切正常,但我最终无法将编辑后的字典保存在 userDefaults 中。没有语法错误,但是当我使用该应用程序并尝试通过第二个 viewController 向 Dictionary 添加另一个元素时,会显示以下错误:
错误消息:
NSForwarding: 警告: 类 '_TtC12myApp7Element' 的对象 0xdcb002c 没有实现 methodSignatureForSelector: -- 前面的麻烦
研究并没有帮助我理解错误信息。
编辑
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
}
}
【问题讨论】: