swift - 相应地为 Plist 上的项目保存 Userdefault 数组

标签 swift save userdefaults

好吧,我只是想问一个问题,这是否可能。我的 plist 上有一系列字典,它显示在 viewcontroller 1 的单元格列表中,大约有 800 个项目。如果用户点击其中一个单元格并转到 Viewcontroller 2,我可以制作与每个单元格关联的用户默认值数组吗?例如,如果我有一份水果 list ,如苹果、香蕉、猕猴桃。用户点击 Apple 并且在 userdefaults 上它知道它点击了第一个单元格并将 userdefault 值设置为 1。我想做的是给每个单元格一个 userdefault 值,这样用户就可以将这些项目保存到他们最喜欢的列表中,我只是使用 userdefault 将该特定项目保存到收藏夹列表。目前,当我使用 userdefault 时,它会立即保存所有项目,因为如果我将一个项目的 bool 值设置为 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 方法单独保存每个单元格?

最佳答案

创建一个字典,其中包含所有收藏夹的键,例如“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)
}

关于swift - 相应地为 Plist 上的项目保存 Userdefault 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48348873/

相关文章:

java - 通过Jsoup登录保存了吗?

javascript - 将 jqPlot 图保存到图像文件

swift - 如何在默认设置中保存当前用户位置?

swift - 在快照中迭代子项并在 Firebase 中的每个子项中获取值

.net - 保存 - .NET (C#) 中的操作顺序

swift - 如何只删除一个子项目的所有userdefaults数据?

ios - 将变量与 UserDefaults 同步的正确方法

swift - 使用 Swift 4 的可解码泛型

objective-c - 无法获得模糊效果

objective-c - Swift 版本的 Objective C rstrip : index problems