我有一个用户Class
,只要应用程序终止,它就会使用saveuser()
方法。用户有两个Arrays
个自定义Classes
子类NSObject
。这是我的编码方法。
func encode(with aCoder: NSCoder) {
aCoder.encode(self.firstName, forKey: coderKey.fName)
aCoder.encode(self.lastName, forKey: coderKey.lName)
aCoder.encode(self.bio, forKey: coderKey.bio)
aCoder.encode(self.tags, forKey: coderKey.tags)
aCoder.encode(self.organizations, forKey: coderKey.orgs)
aCoder.encode(self.img, forKey: coderKey.img)
}
应用程序在编码self.tags
时崩溃。我假设它会对self.organizations
执行相同的操作,因为它也是array
的{{1}},可能还有NSObjects
,因为它是self.img
。这是我得到的错误。
由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [Social_Justice.Tag encodeWithCoder:]:无法识别的选择器发送到实例0x60000005efc0'
我该怎么做才能解决这个问题?如果您需要查看更多代码,请发表评论并进行编辑。
答案 0 :(得分:0)
答案 1 :(得分:0)
<强>答案:强>
我假设数组self.tag s 中的对象的类名和self.organization s 是标记, <强>组织强>
Objective-C使用一种非常不同的函数调用样式。如果你看到[ClassName/ObjectName methodName]
在某种程度上等同于Swift中的ObjectName.function()
样式,那么让我们暂时用这种方式(Swift编译器将来会更好,希望你会调试时不再看到objctive-C警告)
选择器是Objective-C使用的术语,您可以认为这是一种方法。因此,此无法识别的选择器错误警告会告诉您代码尝试调用名为encodeWithCode()
的方法,该方法实际上并不存在于对象标记和组织中( NSCoder系统知道如何编码数组,但不知道在Array中编码自己的对象)
如果要在对象上使用NSCoder
系统的5个具体类,则必须符合NSCoding
协议。这意味着班级(标记和组织)必须实施init?(coder: NSCoder)
和func encode(with: NSCoder)
NSCoder
的4个具体类别为NSArchiver, NSUnarchiver, NSKeyedArchiver, NSKeyedUnarchiver, and NSPortCoder.
进一步阅读:
NSCoding / NSKeyedArchiver By NSHipster
或者:(我最喜欢的)
Apple Document NSKeyedArchiver
或者:(如果这些文件对您来说仍然有点混淆)
Hollemans M。 2016,iOS Apprentice第五版教程2核对表,第126页〜第137页