swift - SwiftUI - 从核心数据 NSSet 中删除 - 带有 .onDelete() 的 @FetchRequest
问题描述
我正在努力学习免费和公开的 Hacking With Swift 课程。不幸的是,Core Data 一章没有解释如何删除 NSSet 中的对象,在一对多关系中使用。我查看了文档并试图弄清楚如何使用 Generated 访问器,但收效甚微。如果有人能够解释如何做到这一点,那将不胜感激,因为我最有兴趣知道!
一对多关系
到目前为止我尝试过的都失败了!!!
func deleteCandy (at offsets: IndexSet) {
for offset in offsets {
let candy = countries[offset].candyArray[offset]
moc.delete(candy)
if self.moc.hasChanges{
try? moc.save()
}
}
}
}
班上:
扩展国家{
@nonobjc public class func fetchRequest() -> NSFetchRequest<Country> {
return NSFetchRequest<Country>(entityName: "Country")
}
@NSManaged public var fullName: String?
public var wrappedFullName: String {
fullName ?? "Unknown Full Name"
}
@NSManaged public var shortName: String?
public var wrappedShortName: String{
shortName ?? "Unknown Short Name"
}
public var candyArray:[Candy] {
let set = candy as? Set<Candy> ?? []
return set.sorted {
$0.wrappedName < $1.wrappedName
}
}
@NSManaged public var candy: NSSet?
}
// MARK: 为糖果扩展 Country { 生成的访问器
@objc(addCandyObject:)
@NSManaged public func addToCandy(_ value: Candy)
@objc(removeCandyObject:)
@NSManaged public func removeFromCandy(_ value: Candy)
@objc(addCandy:)
@NSManaged public func addToCandy(_ values: NSSet)
@objc(removeCandy:)
@NSManaged public func removeFromCandy(_ values: NSSet)
}
ContentView @Environment(.managedObjectContext) var moc @FetchRequest(entity: Country.entity(), sortDescriptors: []) var countries: FetchedResults
var body: some View {
VStack {
List {
ForEach(countries, id: \.self) { country in
Section(header: Text(country.wrappedFullName)) {
ForEach(country.candyArray, id: \.self) { candy in
Text(candy.wrappedName)
}
}
}.onDelete(perform: deleteCandy)
}
Button("Add") {
let candy1 = Candy(context: self.moc)
candy1.name = "Mars"
candy1.origin = Country(context: self.moc)
candy1.origin?.shortName = "UK"
candy1.origin?.fullName = "United Kingdom"
let candy2 = Candy(context: self.moc)
candy2.name = "KitKat"
candy2.origin = Country(context: self.moc)
candy2.origin?.shortName = "UK"
candy2.origin?.fullName = "United Kingdom"
let candy3 = Candy(context: self.moc)
candy3.name = "Twix"
candy3.origin = Country(context: self.moc)
candy3.origin?.shortName = "UK"
candy3.origin?.fullName = "United Kingdom"
let candy4 = Candy(context: self.moc)
candy4.name = "Toblerone"
candy4.origin = Country(context: self.moc)
candy4.origin?.shortName = "CH"
candy4.origin?.fullName = "Switzerland"
try? self.moc.save()
}
}
}
func deleteCandy (at offsets: IndexSet) {
for offset in offsets {
let candy = countries[offset].candyArray[offset]
moc.delete(candy)
if self.moc.hasChanges{
try? moc.save()
}
}
}
用户 界面
解决方案
最后,这个从 DMG 传入闭包的解决方案效果很好:
func deleteCandies(at offsets: IndexSet, from country: Country) {
for offset in offsets.sorted().reversed() {
let candyToDelete = country.candyArray[offset]
country.removeFromCandy(candyToDelete)
moc.delete(candyToDelete)
}
if moc.hasChanges{
try? moc.save()
}
}
VStack {
List {
ForEach(countries, id: \.self) { country in
Section(header: Text(country.wrappedFullName)) {
ForEach(country.candyArray, id: \.self) { candy in
Text(candy.wrappedName)
}
.onDelete(perform: { offsets in
self.deleteCandies(at: offsets, from: country)
})
}
}
}
推荐阅读
- excel - Excel中有没有办法根据单元格样式对单元格进行排序?
- python - 将标签添加到 OneLineAvataListItem Python kivy
- c++ - 命名空间范围在 C++ 中如何工作?
- php - 来自子文件夹 MVC PHP 的访问控制器
- c# - 测试结束时未调用 Specflow.Autofac IDisposable
- javascript - 使用严格相等运算符而不是普通相等运算符获得未定义
- python - Django - POST 端点以更新多个表。返回包含所有相关数据的响应
- javascript - 如何在不包含节点模块文件夹的情况下将我的 React 项目上传到 GitHub
- git - 我需要合并 git repo 的 2 个分支,但浅分支历史导致与子模块 ref 发生冲突(即使我加深了历史)
- reactjs - 如何从我在 firebase 上的文档中获取 doc id