Swift Core-Data 从属性列表中删除项目
Swift Core-Data delete items from attribute list
我正在做一个核心数据项目。
目前我有一个具有以下属性的实体(项目):
@NSManaged public var title: String?
@NSManaged public var list: [String]
我正在使用带有 ForEach 的列表在列表中显示实体。使用导航 link 如果用户选择一个项目,我会打开另一个视图。
主列表代码:
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")
})
}
}
}
用户可以通过按下按钮将子项添加到列表中。
也可以通过滑动删除项目列表中的项目。
现在我希望用户也可以通过滑动来删除子项列表中的子项。
如果我尝试实现相同的功能,那么用户将通过删除一个不是我想要的子项目来删除一个项目。
我不知道如何使用 FetchRequest 只获取名为 list 的属性。有没有办法删除子项?
谢谢。
问题中发布的代码实际上不起作用。
如果您希望能够 运行 查询子项,您可能希望为它们创建一个新实体,并且 link 这两个实体都使用 Core Data 1-to-n 关系.
但是,如果您想坚持使用字符串数组来存储子项,您可以通过添加以下内容来实现滑动删除功能:
.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()
}
}
我正在做一个核心数据项目。 目前我有一个具有以下属性的实体(项目):
@NSManaged public var title: String?
@NSManaged public var list: [String]
我正在使用带有 ForEach 的列表在列表中显示实体。使用导航 link 如果用户选择一个项目,我会打开另一个视图。
主列表代码:
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")
})
}
}
}
用户可以通过按下按钮将子项添加到列表中。
也可以通过滑动删除项目列表中的项目。
现在我希望用户也可以通过滑动来删除子项列表中的子项。 如果我尝试实现相同的功能,那么用户将通过删除一个不是我想要的子项目来删除一个项目。
我不知道如何使用 FetchRequest 只获取名为 list 的属性。有没有办法删除子项?
谢谢。
问题中发布的代码实际上不起作用。
如果您希望能够 运行 查询子项,您可能希望为它们创建一个新实体,并且 link 这两个实体都使用 Core Data 1-to-n 关系.
但是,如果您想坚持使用字符串数组来存储子项,您可以通过添加以下内容来实现滑动删除功能:
.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()
}
}