【问题标题】:Storing a dictionary in NSUserDefaults and using the data stored.在 NSUserDefaults 中存储字典并使用存储的数据。
【发布时间】:2015-09-02 12:50:56
【问题描述】:

我已经为这个问题苦苦挣扎了 5 天。不是开玩笑。请帮忙!这是我遇到的问题。

我所知道的:

我将var addressDict = Dictionary<Int, Array<String>>() 声明为全局变量。现在,我了解以下代码用于附加存储在我的 addressDict 中的数据并更改类型,以便可以将数据存储到 NSUserDefaults 中。

let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving
self.defaults.setObject(data, forKey: "addressDict") //storing
if let data2 = self.defaults.objectForKey("addressDict") as? NSData { 
     let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2)
}

现在,每次我运行应用程序时,存储在addressDict2 中的数据都会被我的addressDict 覆盖,因为当应用程序启动时,addressDict 中没有数据。因此,即使我可能在addressDict2 中添加了一些数据,它也会被没有数据的addressDict 覆盖。

因此,为了解决这个问题,我可以运行上面的代码,但没有 self.defaults.setObject(data, forKey: "addressDict") 行,现在,addressDict2 不再被不包含数据的变量 addressDict 覆盖。所以我附加的数据存储在addressDict2。但是,如果我这样做,我将无法再将新信息附加到addressDict2,因为我不再拥有self.defaults.setObject(data, forKey: "addressDict")。我希望你在这里看到我的困境......

我想知道的:

这就是我希望我的代码执行的操作。我希望能够将新信息附加到某个变量中,例如addressDict2。当应用程序启动时,我希望将addressDict2 中的数据复制到addressDict。所以这将导致addressDict 保存我希望它保存的数据。

我的尝试:

为了解释我上面的意思,这里有一些代码。请注意,此代码不起作用,它只是为了澄清我的意思并显示以下代码是否有效,我认为它将解决我的问题(如果我我错了)。所以在我的viewDidLoad() 中,我会有类似的内容:

override func viewDidLoad() {
    super.viewDidLoad()

    if NSUserDefaults.standardUserDefaults().objectForKey("addressDict") != nil {
        if let data2 = defaults.objectForKey("addressDict") as? NSData { 
            addressDict = NSKeyedUnarchiver.unarchiveObjectWithData(data2) //there is an error here that states: "Cannot assign a value of type AnyObject? to a value of type Dictionary<Int, Array<Strings>>
        }
    }
}

所以现在,当我运行这段代码时:

let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving
self.defaults.setObject(data, forKey: "addressDict") //storing
if let data2 = self.defaults.objectForKey("addressDict") as? NSData { 
     let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2)
}

这里的addressDict 将不再为空,也不会用空数据覆盖addressDict2。我将能够使用addressDict 处理所有永久存储的数据!生活将是美好的。但我不知道该怎么做。

附注对于问题的长度,我深表歉意。感谢您的宝贵时间!

【问题讨论】:

  • 我已经回答了你的问题here。我发布的代码可以编译并且工作正常。你需要的是一个简单的类型转换。
  • 实际上不需要使用NSKeyedUnarchiver,因为包含IntStringArray类型的字典符合属性列表。
  • @Adam,我不确定你是否回答了我在这里提出的问题(当然,我很可能是不正确的)。我想我更进一步,正如@Rajatp 所说,合并addressDictaddressDict2 以便addressDict2 中的数据可以“放入”addressDict

标签: ios swift nsdictionary nsuserdefaults


【解决方案1】:

同时将数据保存到字典中:

let foundationDictionary = NSMutableDictionary(dictionary: StoreDictionary) let dict = NSKeyedArchiver.archivedDataWithRootObject(foundationDictionary) NSUserDefaults.standardUserDefaults().setObject(dict, forKey: "yourkey")

使用保存的数据时:

if NSUserDefaults.standardUserDefaults().objectForKey("UserDetails")!=nil {

let dict : NSData = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as! NSData dictionaryName = NSKeyedUnarchiver.unarchiveObjectWithData(dict) as? NSDictionary
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多