Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在NSUserDefaults中存储自定义对象时,应用程序崩溃_Ios_Xcode_Swift - Fatal编程技术网

Ios 在NSUserDefaults中存储自定义对象时,应用程序崩溃

Ios 在NSUserDefaults中存储自定义对象时,应用程序崩溃,ios,xcode,swift,Ios,Xcode,Swift,我有一个名为User的自定义类,它符合NSCoding协议。但当我试图将其存储在NSUserDefaults中时,会出现以下错误: Property list invalid for format: 200 (property lists cannot contain objects of type 'CFType') 这一警告: NSForwarding: warning: object 0x7f816a681110 of class 'Shikimori.User' does not i

我有一个名为
User
的自定义类,它符合NSCoding协议。但当我试图将其存储在NSUserDefaults中时,会出现以下错误:

Property list invalid for format: 200 
(property lists cannot contain objects of type 'CFType')
这一警告:

NSForwarding: warning: object 0x7f816a681110 of class 'Shikimori.User'
does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[Shikimori.User _copyDescription]
用户
类别:

class User: NSCoding {

private enum CoderKeys: String {
    case ID = "user.id"
    case Username = "user.username"
    case Email = "user.email"
    case Avatar = "user.avatar"
}

let id: Int
let username: String
let email: String
let avatar: String

init(id: Int, username: String, email: String, avatar: String) {
    self.id = id
    self.username = username
    self.email = email
    self.avatar = avatar
}

required init(coder aDecoder: NSCoder) {
    id = aDecoder.decodeIntegerForKey(CoderKeys.ID.rawValue)
    username = aDecoder.decodeObjectForKey(CoderKeys.Username.rawValue) as String
    email = aDecoder.decodeObjectForKey(CoderKeys.Email.rawValue) as String
    avatar = aDecoder.decodeObjectForKey(CoderKeys.Avatar.rawValue) as String
}

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeInteger(id, forKey: CoderKeys.ID.rawValue)
    aCoder.encodeObject(username as NSString, forKey: CoderKeys.Username.rawValue)
    aCoder.encodeObject(email as NSString, forKey: CoderKeys.Email.rawValue)
    aCoder.encodeObject(avatar as NSString, forKey: CoderKeys.Avatar.rawValue)
}
}
更新 保存代码:

let userKeyForDefaults = "apimanager.user"


let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(user, forKey: self.userKeyForDefaults)

nsserdefaults
不支持所有对象,只支持
NSString
NSDictionary
,最重要的是,
NSData
。这就是
NSCoding
协议派上用场的地方。它允许我们将自定义对象转换为
NSData
块。为此,请使用
NSKeyedArchiver
类将符合
NSCoding
的自定义对象转换为等效的
NSData

let obj = User()
let data = NSKeyedArchiver. archivedDataWithRootObject(obj)
/// Now you can store data
可以找到文档,并且您正在寻找的方法是

class func archivedDataWithRootObject(_ rootObject: AnyObject) -> NSData
要从
NSUserDefaults
中获取信息,请使用“反向”类
nskeyedunachiver
。其适当的方法如下

class func unarchiveObjectWithData(_ data: NSData) -> AnyObject?
这是一个样本

let data = NSUserDefaults.standardUserDefaults().objectForKey("somekey")
let obj = NSKeyedUnarchiver. unarchiveObjectWithData(data) as User?
注意:我可能混淆了一些选项,但是你得到了jist。可以找到
NSKeyedUnarchiver
的文档


编辑:修复OP的问题非常简单,只需正确使用
NSKeyedArchiver
和子类化
NSObject

您无法将自定义对象存储到NSUserDefaults@vivek,即使它符合NSCoding?我还没有尝试过,但也许您的类必须基于NSObject?所以类用户:NSObject,NSCoding@Volker,不,仍然崩溃您必须先将对象转换为NSData,然后再将其添加到用户默认值中,从而回答herehttp://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaultsStill 不能但我不明白为什么@devnikor您尝试过我的解决方案并将其子类化为
NSObject
,这是我唯一能想到的。@devnikor检查一下,它支持了我的想法。最后子类化NSObject和NSKeyedArchiver可以修复它。谢谢