如何在SwiftUI中使用CoreData更改数据值?

时间:2019-09-05 23:38:39

标签: core-data swiftui

使用CoreData和SwiftUI更改数据的值

我正在尝试使用列表中单元格上的按钮(心脏)来修改数据的布尔值isFavorite

模型数据

import Foundation
import CoreData

public class VoitureItem: NSManagedObject, Identifiable {


    @NSManaged public var marque: String?
    @NSManaged public var modele: String?
    @NSManaged public var annee: String?
    @NSManaged public var energie: String?
    @NSManaged public var kilometrage: String?
    @NSManaged public var isFavorite: Bool

}

extension VoitureItem {
    static func getAllVoitureItems() -> NSFetchRequest<VoitureItem> {

        let request:NSFetchRequest<VoitureItem> = VoitureItem.fetchRequest() as! NSFetchRequest<VoitureItem>

        let sortDescriptor = NSSortDescriptor(key: "isFavorite", ascending: false)

        request.sortDescriptors = [sortDescriptor]

         return request   
    }  
}

ScreenShot of ContentView result

我在ContentView中使用managedObjectCOntextFetchRequest来显示List中的所有数据并创建新数据。 我想知道如何单击按钮即可更改CoreData中的isFavorite的值。

ContentView()(主视图)

struct ContentView: View {

    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: VoitureItem.getAllVoitureItems()) var voitureItems: FetchedResults<VoitureItem>


    var body: some View {
        NavigationView {
            List {//show list of all the data}
        }
     }

单元格上的按钮

Button(action: {

                //var fav: Bool = false
                print("favorite")

                //HERE - Change isFavorite in coreData

            }) {
                if isFavorite {
                    Image(systemName: "heart.fill")
                        .foregroundColor(Color.yellow)
                } else {
                    Image(systemName: "heart")
                        .foregroundColor(Color.gray)
                }
            }

1 个答案:

答案 0 :(得分:0)

类似的事情应该起作用。

List(voitureItems) { item in
    ItemCell(item: $item)
}

...

struct ItemCell: View {

    @Binding var item: VoitureItem

    var body: some View {
        Button(action: {
            item.isFavourite.toggle()
        }) {
            if item.isFavourite {
                Image(systemName: "heart.fill")
                    .foregroundColor(Color.yellow)
            } else {
                Image(systemName: "heart")
                    .foregroundColor(Color.gray)
            }
        }
    }
}