我正在尝试将一些字典添加到数组中,并使用UserDefaults
保存它,但是问题是该数组没有追加新字典,而是仅替换了字典。我该如何解决这个问题?
代码如下:
class Bookmark: NSObject {
var bookmark: [[String:Any]] = []
override init() {
super.init()
}
func setBookmark(imageURL:String, title:String, description:String, summary:String, date:String, link:String) {
bookmark.append(["imageURL":imageURL , "title":title , "description":description, "summary":summary , "date":date, "link":link])
UserDefaults.standard.set(bookmark, forKey: "bookmark")
}
func getBookrmark() -> [Any] {
let loadedBookmark = UserDefaults.standard.array(forKey: "bookmark")
return (loadedBookmark)!
}
}
使用书签类:
class ReadViewController: UIViewController {
var bookmark = Bookmark()
func save() {
bookmark.setBookmark(imageURL: nImageURL.absoluteString, title: ntitle!, description: nDescription.htmlToString , summary: nSummary!, date: nDate!, link: nLink.absoluteString)
}
答案 0 :(得分:1)
没有足够的信息,但是我可以猜到你在哪里犯错了。
您的类Bookmark
不是 singleton 类,因此每次Bookmark()
每次都创建一个新实例。这意味着它将为每个实例创建新的bookmark
对象。
我建议您使用func func setBookmark(imageURL:String, title:String, description:String, summary:String, date:String, link:String)
方法1::在单独的变量中获取最新的书签,并在其中添加新对象,并写入User Default并更新全局对象
方法2 ,或者您可以将其设置为单例并在每次执行操作时使用共享实例。
方法3 的另一种解决方案是在Bookmark
或您的singleton类中创建AppDelegate
的全局对象,然后使用该对象
但是
func setBookmark(imageURL:String, title:String, description:String, summary:String, date:String, link:String) {
bookmark.append(["imageURL":imageURL , "title":title , "description":description, "summary":summary , "date":date, "link":link])
UserDefaults.standard.set(bookmark, forKey: "bookmark")
}
这是不正确的做法。您直接用新值替换用户默认值,但是您的意图是添加新元素,而不是替换用户默认值中的现有数据。
您应该始终获取最新信息并进行更新,就像方法1所示,以及如果您希望以userdefault来获取数据,则因为您已经拥有var bookmark: [[String:Any]] = []
方法,所以不使用全局对象getBookrmark
希望您很清楚
答案 1 :(得分:0)
我已经尝试将上述代码与示例结合使用,并且可以正常工作。
class ViewController: UIViewController {
let b = Bookmark()
override func viewDidLoad() {
super.viewDidLoad()
b.setBookmark(imageURL: "a", title: "a", description: "a", summary: "a", date: "a", link: "a")
b.setBookmark(imageURL: "b", title: "b", description: "b", summary: "b", date: "b", link: "b")
print(b.getBookrmark())
}
}
输出:
[{
date = a;
description = a;
imageURL = a;
link = a;
summary = a;
title = a;
}, {
date = b;
description = b;
imageURL = b;
link = b;
summary = b;
title = b;
}]
检查您是否使用相同的方式或其他方式。