首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用NSCoder编码阵列

用NSCoder编码阵列
EN

Stack Overflow用户
提问于 2017-02-11 06:08:16
回答 2查看 1.6K关注 0票数 0

我有一个用户Class,它在应用程序终止时使用saveuser()方法。用户有两个自定义Arrays Classes,即子类NSObject.这是我的编码方法。

代码语言:javascript
复制
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做同样的事情,因为它也是一个NSObjectsarray,而可能是self.img,因为它是一个UIImage。这是我正在犯的错误。

由于未识别的异常“NSInvalidArgumentException”终止应用程序,原因:-Social_Justice.Tag encodeWithCoder::未识别的选择器发送到实例0x60000005efc0‘

我该怎么办才能解决这个问题呢?如果您需要看到更多的代码,只需注释,我将编辑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-12 00:38:49

正如大卫·贝瑞在最初的文章中所评论的那样。您必须确保正在尝试编码的任何自定义类也符合NSCoder。他们不需要有存档路径,他们只需要有编码和解码功能。

票数 0
EN

Stack Overflow用户

发布于 2017-06-27 19:51:10

答案:

  1. 我假设数组中的对象的类名是self.organizations、、和,标签是和。
  2. 目标-C使用非常不同的函数调用风格。如果您在Swift中看到了[ClassName/ObjectName methodName],它在某种程度上等同于ObjectName.function()样式,那么让我们暂时用这种方式来描述它( Swift编译器将来会更好,希望您在调试时不会再看到objctive-C警告)
  3. 选择器是目标C使用的术语,你可以认为这是一种方法。因此,这个未识别的选择器错误警告告诉您,代码试图调用一个名为encodeWithCode()的方法,该方法实际上并不存在于标记和中( NSCoder系统知道如何编码数组,但不知道如何在数组中编码自己的对象)
  4. 如果要在对象上使用NSCoder系统的5个具体类,则对象必须符合NSCoding协议。这意味着类(标记和必须实现init?(coder: NSCoder)func encode(with: NSCoder) )。
  5. NSCoder的4个具体类是NSArchiver, NSUnarchiver, NSKeyedArchiver, NSKeyedUnarchiver, and NSPortCoder.

继续阅读:

NSCoding /NSKeyed​存档器(由NSHipster编写)

或者:(我最喜欢的)

苹果文档NSCoder

苹果文档NSKeyedArchiver

苹果文档NSCoding

或者:(如果那些文件对你来说还有点混乱)

Hollemans M. 2016,iOS学徒第五版教程2核对表,第126页~第137页

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42172880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档