SwiftUI - 从核心数据 NSSet 中删除 - @FetchRequest with .onDelete()

标签 swift core-data swiftui

我正在学习免费和公开的 Hacking With Swift 类(class)。不幸的是,关于 Core Data 的章节没有解释如何删除 NSSet 中用于一对多关系的对象。我查看了文档并尝试弄清楚如何使用生成的访问器,但收效甚微。如果有人能够解释如何做到这一点,我将不胜感激,因为我最想知道!!
One To Many Relationship

到目前为止我尝试过但失败了!!!


 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:为糖果生成访问器 扩展国家 {

@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)

内容 View @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()
        }
    }
}

} The UI

最佳答案

最后,这个从 DMG 传递闭包的解决方案非常有效:

Well explained solution here.

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)
                    })
                }
            }
        }

关于SwiftUI - 从核心数据 NSSet 中删除 - @FetchRequest with .onDelete(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61026300/

相关文章:

ios - CoreData 获取所有一对多关系

ios - 核心数据 : Fetching Relationship Attributes

SwiftUI 多窗口关闭会导致崩溃

swift - 参数类型 'xxx' 不符合预期类型 '_FormatSpecifiable'

ios - 使用共享扩展将图像保存到文档文件夹

ios - 如何创建队列并手动启动它

ios - 以内存有效的方式比较两组数据

ios - 为什么在将 objectWithID 与 CoreData 一起使用时我没有得到相同的对象?

SwiftUI navigationView within Modal 'pushing' 查看向下

Xcode 11 beta 5 中的 Path.fill 不再有效