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

Posted

技术标签:

【中文标题】SwiftUI CoreData - 如何更新获取请求和列表【英文标题】:SwiftUI CoreData - How to update the fetch request and the list 【发布时间】:2021-08-24 17:06:20 【问题描述】:

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

最喜欢的歌曲列表:

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

【问题讨论】:

【参考方案1】:

使用这个NSPredicate

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

【讨论】:

非常感谢

以上是关于SwiftUI CoreData - 如何更新获取请求和列表的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中更新 CoreData 时更新状态变量

SwiftUI 中的 CoreData:如何清楚地获取属性?

如何在 SwiftUI 中从 FetchedResults (CoreData) 中获取 NSOrderedSet

如何使用 SwiftUI 更新 Firebase 中的集合?

SwiftUI - 在Coredata中添加链接对象后视图不更新

SwiftUI 和 CoreData:将 FetchResults 传递给 DetailView 并更新它们