SwiftUI CoreData - 如何更新获取请求和列表

SwiftUI CoreData - How to update the fetch request and the list

我正在使用 CoreData 在 SwiftUI 中创建应用程序,但我遇到了问题。在应用程序中,您可以将歌曲添加到收藏夹,它将被添加到列表(FavoriteSongsView)。在将歌曲添加到收藏夹之前,一切都很好。在 DetailView 中,我单击按钮和“heart.fill”图标,歌曲被添加到列表中。但是,如果我再次单击该图标以 un-favorite 这首歌,它不会从列表中消失。我和它战斗了一点,但没有任何效果。能否请您指出问题的原因?

最喜欢的歌曲列表:

    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(
        entity: Song.entity(),
        sortDescriptors: [NSSortDescriptor(keyPath: \Song.number, ascending: true)],
        predicate: NSPredicate(format: "favorite <> 'false'")
    ) var songs: FetchedResults<Song>
    var body: some View {
        NavigationView{
            VStack{
                List {
                    ForEach(songs, id:\.self){ song in
                        NavigationLink(destination: DetailView(song: song, isSelected: song.favorite)) {
                            HStack{
                                Text("\(song.number). ") .font(.headline) + Text(song.title ?? "No title")
                            }
                        }
                    }
                }
            }
            .listStyle(InsetListStyle())
            .navigationTitle("Favorite")
        }
    }
}

详细视图:

struct DetailView: View {
    @State var song : Song
    @State var isSelected: Bool
    @State var wrongNumber: Bool = false
    var body: some View {
        VStack{
            Text(song.content!)
                .padding()
            Spacer()
        }
        .navigationBarTitle("\(song.number). \(song.title ?? "No title")", displayMode: .inline)
        .toolbar {
            ToolbarItemGroup(placement: .navigationBarTrailing) {
                HStack{
                    Button(action: {
                        song.favorite.toggle()
                        PersistenceController.shared.save()
                        isSelected=song.favorite
                    }) {
                        Image(systemName: "heart.fill")
                            .foregroundColor(isSelected ? .red : .blue)
                    }
                    Button(action: {
                        alert()
                    }) {
                        Image(systemName: "1.magnifyingglass")
                    }
                    NavigationLink("DetailView", destination: DetailView(song: song, isSelected: isSelected))
                    .frame(width: 0, height: 0)
                    .hidden()
                }
            }
        }
    }
}

使用这个NSPredicate

NSPredicate(format: "favorite = %d", false)