【问题标题】:Swift Core-Data delete items from attribute listSwift Core-Data 从属性列表中删除项目
【发布时间】:2020-08-12 12:58:13
【问题描述】:

我正在从事一个核心数据项目。 目前我有一个具有以下属性的实体(项目):

@NSManaged public var title: String?
@NSManaged public var list: [String]

我正在使用带有 ForEach 的列表在列表中显示实体。如果用户选择一个项目,我会通过导航链接打开另一个视图。

主列表代码:

struct ItemList: View {
@Environment(\.managedObjectContext) var viewContext
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Item.title, ascending: true)]) 
var ItemFetch: FetchedResults<Item>

   var body: some View {
      NavigationView {
         List {
            ForEach(ItemFetch, id: \.self {item in
               NavigationLink(destination: ItemView(Item: item) {
                  Text(item.title)
               }
            }
            .onDelete(perform: removeItem(at:))
         }
      }
   }
   private func removeItem(at offsets: IndexSet) {
           for index in offsets {
               let item = ItemFetch[index]
               viewContext.delete(item)
        }
    }
}

二次查看代码:

struct ItemView: View {

@Environment(\.managedObjectContext) var viewContext
@ObservedObject var Item: Item

var body: some View{
NavigationView {
   List {
      ForEach { Item.list.indices { entry in
         Text(self.Item.list[entry]
      }
   }
   .navigationBarItem(
          trailing:
               Button(action: {
                   self.Item.list.append("SubItem")
       }) {
                   Text("Add SubItem")
        })
      }
   }
}

用户可以通过按下按钮将子项添加到列表中。

项目列表中的项目也可以通过滑动删除。

现在我希望用户也可以通过滑动来删除子项列表中的子项。 如果我尝试实现相同的功能,那么用户将通过删除我不想要的 SubItem 来删除 Item。

我不知道如何使用 FetchRequest 只获取名为 list 的属性。有没有办法这样做或以其他方式删除子项?

谢谢。

【问题讨论】:

    标签: swift core-data swiftui nsfetchrequest nsobject


    【解决方案1】:

    问题中发布的代码实际上不起作用。

    如果您希望能够对子项运行查询,您可能需要为它们创建一个新实体,并使用 Core Data 一对一关系链接这两个实体。

    如果你想坚持一个字符串数组来存储子项,你可以通过添加来实现滑动删除功能:

    .onDelete(perform: removeSubItem(at:))

    到ItemView中的ForEach,即

    ForEach(Item.list, id: \.self) { entry in // you should actually call it "item" to avoid confusion...
        Text(entry)
    }.onDelete(perform: removeSubItem(at:))
    

    removeSubItem可能看起来像这样:

    private func removeSubItem(at offsets: IndexSet) {
        for index in offsets {
            Item.list.remove(at: index)  // you should actually call it "item" to avoid confusion...
            try? viewContext.save()
        }
    }
    

    【讨论】:

    • 嘿 Lobo,很遗憾,即使这是解决方案,我也无法支持您的答案。非常感谢你。现在,我将坚持使用数组,直到我了解更多关于核心数据关系的知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2020-12-15
    • 1970-01-01
    • 2022-12-20
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多