【问题标题】:Saving custom NSObject in NSUserDefaults在 NSUserDefaults 中保存自定义 NSObject
【发布时间】:2016-03-22 05:48:47
【问题描述】:

我有一个模态实体文件,如下所示,

import UIKit
class MyProfile: NSObject {
   var userName : String = ""

    func initWithDict(dict: NSMutableDictionary) {
     self.userName =  dict.objectForKey("username") as! String
    }
}

通过如下编码保存该实体,

    let myDict: NSMutableDictionary = ["username": "abc"]
    let myEntity:MyProfile = MyProfile()
    myEntity.initWithDict(myDict)
    let userDefaults = NSUserDefaults.standardUserDefaults()
    let encodedData = NSKeyedArchiver.archivedDataWithRootObject(myEntity)
    userDefaults.setObject(encodedData, forKey: "MyProfileEntity")
    userDefaults.synchronize()

获取保存的实体如下,

    let myEntity:MyProfile = MyProfile()
    let userDefaults = NSUserDefaults.standardUserDefaults()
    guard let decodedNSData = userDefaults.objectForKey("MyProfileEntity") as? NSData,
        myEntity = NSKeyedUnarchiver.unarchiveObjectWithData(decodedNSData) as? MyProfile!
        else {
            print("Failed")
            return
    }

    print(myEntity.userName)

它不工作,有崩溃和很多语法错误,我是 swift 新手,

它在unarchiveObjectWithData 行中显示了一些语法错误,例如定义与以前的值冲突。如果我修复了该错误,那么在从 userdefaults 获取实体时它会崩溃。

谁能建议我如何解决它?

【问题讨论】:

  • 你遇到了什么错误?
  • @ryantxr,它显示了一些语法错误,例如定义与以前的值冲突.....
  • 如果您需要帮助,您需要具体说明。使用完整和准确的错误消息更新您的问题,并指出导致错误的确切行。
  • @rmaddy,编辑了问题。

标签: ios swift nsuserdefaults nsobject nskeyedarchiver


【解决方案1】:

要将自定义对象保存到用户默认值中,您必须实现 NSCoding 协议。请像这样替换您的自定义数据模型:

class MyProfile: NSObject,NSCoding {
var userName : String = ""

@objc required init(coder aDecoder:NSCoder){

    self.userName = aDecoder.decodeObjectForKey("USER_NAME") as! String

}

@objc func encodeWithCoder(aCoder: NSCoder) {
  aCoder.encodeObject(self.userName, forKey: "USER_NAME")
}

init(dict: [String: String]) {

    self.userName = dict["username"]!
}

override init() {
    super.init()
}

}

这里是保存和检索 MyProfile 对象的代码:

// Save profile
    func saveProfile(profile: MyProfile){
        let filename = NSHomeDirectory().stringByAppendingString("/Documents/profile.bin")
        let data = NSKeyedArchiver.archivedDataWithRootObject(profile)
        data.writeToFile(filename, atomically: true)
    }
    // Get profile
    func getProfile() -> MyProfile?{

        if let data = NSData(contentsOfFile: NSHomeDirectory().stringByAppendingString("/Documents/profile.bin")){

            let unarchiveProfile = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! MyProfile

                return unarchiveProfile

        } else{

            return nil

        }

    }

现在这里是代码sn-p如何使用这些方法:

// Create profile object
let profile = MyProfile(dict: ["username" : "MOHAMMAD"])
// save  profile
saveProfile(profile)

// retrieve profile
if let myProfile = getProfile(){
    print(myProfile.userName)
}else{
    print("Profile not found")
}

【讨论】:

  • 感谢您的回复,您也可以提供保存和检索语法吗...?该部分的主要问题
  • 嗨@NAZIK 检查我编辑的答案。希望你会喜欢:)
  • 再次感谢,但您上面的代码中有一个错误,“调用中的参数标签不正确”,同时创建 MyProfile -let profile = MyProfile(dict: ....,如何解决?我尝试了 coder 而不是 dict 但没有运气...
  • 效果很好,节省了很多时间,希望对其他人也有帮助。
【解决方案2】:

你不能这样做:

let myEntity:MyProfile = MyProfile()

然后稍后,执行此操作:

myEntity = ...

当某些东西用'let'定义时,你不能改变它。

更改为 var myEntity: MyProfile?

有可能

NSKeyedUnarchiver.unarchiveObjectWithData(decodedNSData)

返回零。然后,您继续通过添加

来强制展开
as? MyProfile!

尝试将其更改为

as? MyProfile

然后,看看你有没有回来

if let myEntity = myEntity {
    print(myEntity.userName)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多