相应地为 Plist 上的项目保存用户默认数组

Posted

技术标签:

【中文标题】相应地为 Plist 上的项目保存用户默认数组【英文标题】:Userdefault Array Saving for Items on Plist Accordingly 【发布时间】:2018-01-19 20:16:57 【问题描述】:

好的,所以我有一个简短的问题,这是否可能。我的 plist 上有一系列字典,它显示在 viewcontroller 1 上的大约 800 个项目的单元格列表中。如果用户点击其中一个单元格并转到 Viewcontroller 2,我可以制作一个与每个单元格关联的 userdefaults 数组吗?例如,如果我有一份水果清单,如苹果、香蕉、猕猴桃。用户点击Apple并且在userdefaults上它知道它点击了第一个单元格并将userdefault值设置为1。我想要做的是给每个单元格的userdefault值,以便用户可以将这些项目保存到他们最喜欢的列表中,我只是使用 userdefault 将该特定项目保存到收藏夹列表。目前,当我使用 userdefault 时,它会立即保存所有项目,因为如果我将一个项目的布尔值设置为 true,它会为所有项目执行此操作,因为 plist 单元格上的每个项目都使用相同的 userdefault 键。就像在我的 viewcontroller 2 上设置的一样

var isFavorite = UserDefaults.standard.bool(forKey: "isFavorite")

@IBAction func addToFav(_ sender: UIButton)
    isFavorite = !isFavorite
    UserDefaults.standard.set(isFavorite, forKey: "isFavorite")
    UpdateButtonAppearance()


func UpdateButtonAppearance()
    if isFavorite
        let image = UIImage(named: "addFav")
        favButton.setImage(image, for: .normal)
     else
        let image = UIImage(named: "addFavFilled")
        favButton.setImage(image, for: .normal)
    

所以为了避免以相同的方式保存所有列表,我想知道如何使用 userdefault 方法单独保存每个单元格?

【问题讨论】:

用户默认设置可能不适合你。最好探索其他缓存替代方案。这些数据需要保存多长时间? 数据必须永远保存,直到用户不喜欢该项目。我只是想添加一个喜欢的按钮,它只是将值从 false 更改为 true 并保存。 【参考方案1】:

创建一个字典,其中包含所有收藏夹的键,例如“Apple”、“Banana”、“Kiwi”和“true”作为值。如果 UserDefaults 能够同时理解键和值(即它们都是字符串),它应该很乐意为您保存一个字典。

let kFavoritesKey = "Favorites"
class FavoritesStorage 
    // Instantiate with some default favorites
    var dict = ["Apple":"true", "Banana":"true", "Kiwi":"true"]

    init() 
        loadFromDisk()
    

    func favor(_ key: String) 
        dict[key] = "true"
        saveToDisk()
    

    func unFavor(_ key: String) 
        dict[key] = nil
        saveToDisk()
    

    func isFavored(_ key : String) -> Bool 
        return dict[key] != nil
    

    func toggle(_ key: String) 
        let favored = isFavored(key)
        if favored 
            unFavor(key)
         else 
            favor(key)
        
    

    // These can be changed to save/read somewhere else besides user defaults
    private func saveToDisk() 
        UserDefaults.standard.set(dict, forKey: kFavoritesKey)
    

    private func loadFromDisk() 
        if let diskVersion = UserDefaults.standard.object(forKey: kFavoritesKey) as? [String: String] 
            dict = diskVersion
        
    


let favorites = FavoritesStorage()

var isAppleFavorited = favorites.isFavored("Apple") // true
var isMangoFavorited = favorites.isFavored("Mango") // false

if !isMangoFavorited 
    favorites.favor("Mango")

isMangoFavorited = favorites.isFavored("Mango") // true
favorites.toggle("Apple")
isAppleFavorited = favorites.isFavored("Apple") // false

if let diskVersion = UserDefaults.standard.object(forKey: kFavoritesKey) 
    print(diskVersion)

【讨论】:

必须保存数据,直到用户取消收藏该项目。嘿,兰迪,所以如果我有超过 800 个项目,你想让我为所有 800 个项目写 var dict = ["etc": true....] 吗?我无法以某种方式集成已经包含所有 800 个项目的 plist 文件,将布尔值更改为 true 或 false 并保存? @Dkeem 您不必硬编码任何收藏夹,这只是一个示例解决方案。你可以从不喜欢的东西开始。请注意,false 为零,因此您不必将任何未收藏的项目保存在收藏夹中。这是一种简单而紧凑的方法。希望对您有所帮助。

以上是关于相应地为 Plist 上的项目保存用户默认数组的主要内容,如果未能解决你的问题,请参考以下文章

在 BASH 中,如何使用 plist 上的默认值写入数组中的现有元素?

如何使用 SWIFT 在 plist 中访问数组及其对象?

将具有多个属性的可变数组保存到 plist

Swift 3 - 从 plist 的所有数组中获取所有项目

如何将自定义数组保存/重新加载到 plist

plist、数组和字典的元素之间有啥关系?