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)
我正在使用 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)