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 文本存储的主要内容,如果未能解决你的问题,请参考以下文章