Quandry 文本存储

Posted

技术标签:

【中文标题】Quandry 文本存储【英文标题】:Quandry over Text Storage 【发布时间】:2020-12-07 00:12:56 【问题描述】:

我有一个包含许多类别的应用程序——有些可以由用户更改,有些则不能。不能更改的类别当前存储在一个数组中,而用户可以更改的类别存储在一个类中。在创建选择器需要显示两种类型的类别的费用条目时出现问题。

硬币的另一面是将所有类别(文本字符串)放在类中。这里费用条目选择器和类存储可以正常工作,但是出现了阻止用户删除默认类别的问题。

我猜后一个选项是更好的方法,因为它将所有类别都放在选择器列表中。这是用于存储动态类别的代码。我想我可以添加一些 init() 代码来存储不变的类别。不知道具体该怎么做。

struct CatItem:  Codable 

    var catName: String
    var catPix: String


class Categories: ObservableObject 
    
    @Published var catItem: [CatItem] 
        didSet 
            let encoder = JSONEncoder()
            if let encoded = try? encoder.encode(catItem) 
                UserDefaults.standard.set(encoded, forKey: "workCat")
            
        
    
    
    init() 
        if let catItem = UserDefaults.standard.data(forKey: "workCat") 
            let decoder = JSONDecoder()
            if let decoded = try? decoder.decode([CatItem].self, from: catItem) 
                self.catItem = decoded
                return
            
        
        
        self.catItem = []
    

您将如何防止用户删除某些固定类别?通常你有一个带有 onDelete 语句的列表。 你可以使用索引来确定是否允许删除吗?例如,如果 indexSet[index]

.onDelete  indexSet in
                for index in indexSet 
                  remove entry
                    
                
                do 
                    try viewContext.save()
                 catch 
                    print(error.localizedDescription)
                
            
        

【问题讨论】:

【参考方案1】:

我假设你想要类似的东西

.onDelete  indexSet in
   guard let i = indexSet.first, indexSet[i] < 8 else  return 

   // .. other code

【讨论】:

是的,我认为这会起作用,谢谢。但是我将如何初始化 catItem 类数组?类似于 let self.catItem.catName = ["name1", "name2", "name3"] let self.catItem.catPix = ["pix1", "pix2", "pix3"]。初始化时出现“预期模式”错误【参考方案2】:

我解决了这个存储难题,决定将永久和可变类别存储在同一个类 catItem 中。在可以查看类别和可以添加新类别的模块中,我使用过滤列表仅显示可以编辑的类别。

这是在启动时初始化类别的方式:

let item = CatItem(catName: "name1", catPix: "sf symbol", noShow: true)
    self.catItem.append(item)

这是类别在列表中的显示方式:

List 
    ForEach(categories.catItem, id: \.catName)  item in
        if item.noShow == false 
            
            HStack 
                Text(item.catName)
                    .padding(.horizontal, 10)
                    
                Spacer()
                    
                Image(systemName: item.catPix).resizable()
                    .frame(width: 30, height: 30)
            
        
    
    .onDelete(perform: removeItems)

因此,如果用户在列表中看不到永久类别,则无法删除它们。用户只能删除他们添加的类别。

当用户添加新类别时,noShow 参数设置为 false。

在选择器中,没有过滤类别,因此可以查看所有类别。

【讨论】:

以上是关于Quandry 文本存储的主要内容,如果未能解决你的问题,请参考以下文章

如何将数组文本框存储在 cookie 或本地存储中?

怎样把excel中所有以文本形式存储的数字转换为数字啊???

Azure API App,在哪里存储纯文本文件?

5.1 文件存储

Android Spanable 文本保存/存储问题

将多个 json 对象存储到文本文件 iOS