使用 NSCoder 编码数组
Encode Array with NSCoder
我有一个用户 Class
,只要应用程序终止,它就会使用 saveuser()
方法。用户有两个 Arrays
的自定义 Classes
,子 class 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
做同样的事情,因为它也是 NSObjects
的 array
,并且可能对 self.img
做同样的事情,因为它是 UIImage
。这是我收到的错误。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Social_Justice.Tag encodeWithCoder:]: unrecognized selector sent to instance 0x60000005efc0'
我应该怎么做才能解决这个问题?如果您需要查看更多代码,请发表评论,我会进行编辑。
正如 David Berry 对原文的评论 post。您必须确保您尝试编码的任何自定义 类 也符合 NSCoder。他们不需要有存档路径,他们只需要有编码和解码功能。
答案:
我假设class数组中对象的名称self.tags和self.organizations 是 标签 和 组织
Objective-C 使用非常不同的函数调用风格。如果你看到 [ClassName/ObjectName methodName]
在某种程度上等同于 Swift 中的 ObjectName.function()
风格,我们暂时这样说(Swift 编译器将来会更好,希望您在调试时不会再看到 objctive-C 警告)
一个selector是Objective-C使用的术语,你可以认为这是一种方法。因此,这个无法识别的选择器错误警告告诉您代码试图调用一个名为 encodeWithCode()
的方法,该方法实际上并不存在于对象 Tag 和 Organization(NSCoder系统知道如何编码一个数组,但不知道如何编码你自己的数组内部对象)
如果你想在对象上使用NSCoder
系统的5个具体classes,对象必须符合NSCoding
协议。这意味着 class(Tag 和 Organization)必须实现 init?(coder: NSCoder)
和 func encode(with: NSCoder)
NSCoder
的4个具体class是NSArchiver, NSUnarchiver, NSKeyedArchiver, NSKeyedUnarchiver, and NSPortCoder.
进一步阅读:
NSCoding / NSKeyedArchiver By NSHipster
或者:(我最喜欢的)
Apple Document NSKeyedArchiver
或者:(如果那些文档对你来说还是有点混淆)
Hollemans M. 2016,iOS 学徒第五版教程 2 检查表,第 126 页 ~ 第 137 页
我有一个用户 Class
,只要应用程序终止,它就会使用 saveuser()
方法。用户有两个 Arrays
的自定义 Classes
,子 class 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
做同样的事情,因为它也是 NSObjects
的 array
,并且可能对 self.img
做同样的事情,因为它是 UIImage
。这是我收到的错误。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Social_Justice.Tag encodeWithCoder:]: unrecognized selector sent to instance 0x60000005efc0'
我应该怎么做才能解决这个问题?如果您需要查看更多代码,请发表评论,我会进行编辑。
正如 David Berry 对原文的评论 post。您必须确保您尝试编码的任何自定义 类 也符合 NSCoder。他们不需要有存档路径,他们只需要有编码和解码功能。
答案:
我假设class数组中对象的名称self.tags和self.organizations 是 标签 和 组织
Objective-C 使用非常不同的函数调用风格。如果你看到
[ClassName/ObjectName methodName]
在某种程度上等同于 Swift 中的ObjectName.function()
风格,我们暂时这样说(Swift 编译器将来会更好,希望您在调试时不会再看到 objctive-C 警告)一个selector是Objective-C使用的术语,你可以认为这是一种方法。因此,这个无法识别的选择器错误警告告诉您代码试图调用一个名为
encodeWithCode()
的方法,该方法实际上并不存在于对象 Tag 和 Organization(NSCoder系统知道如何编码一个数组,但不知道如何编码你自己的数组内部对象)如果你想在对象上使用
NSCoder
系统的5个具体classes,对象必须符合NSCoding
协议。这意味着 class(Tag 和 Organization)必须实现init?(coder: NSCoder)
和func encode(with: NSCoder)
NSCoder
的4个具体class是NSArchiver, NSUnarchiver, NSKeyedArchiver, NSKeyedUnarchiver, and NSPortCoder.
进一步阅读:
NSCoding / NSKeyedArchiver By NSHipster
或者:(我最喜欢的)
Apple Document NSKeyedArchiver
或者:(如果那些文档对你来说还是有点混淆)
Hollemans M. 2016,iOS 学徒第五版教程 2 检查表,第 126 页 ~ 第 137 页