У меня есть следующий код внутри проекта CoreData SwiftUI:
import SwiftUI
struct ContentView: View {
@FetchRequest(entity: TestObject.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \TestObject.name, ascending: true)]) var objects: FetchedResults<TestObject>
@Environment(\.managedObjectContext) var managedObjectContext
@State private var showFavorites = true
var body: some View {
NavigationView {
List {
if(showFavorites) {
Section(header: Text("Favorites").font(.headline).padding(.leading, -8)) {
ForEach(self.objects.filter({ (testObj) -> Bool in
return testObj.isFavorite
}), id: \.id) { obj in
NavigationLink(destination: DetailsView(testObject: obj)) {
Text(obj.name ?? "")
}
}
}
}
Section(header: Text("All").font(.headline).padding(.leading, -8)) {
ForEach(self.objects, id: \.id) { obj in
NavigationLink(destination: DetailsView(testObject: obj)) {
Text(obj.name ?? "")
}
}
}
}.listStyle(GroupedListStyle())
.environment(\.horizontalSizeClass, .regular)
.navigationBarTitle("Test", displayMode: .large)
.navigationBarItems(
trailing: Button(action: {
let newObj = TestObject(context: self.managedObjectContext)
newObj.name = "newTest"
newObj.id = UUID()
newObj.isFavorite = false
do {
try self.managedObjectContext.save()
} catch let error {
print(error)
print("error saving object")
}
}) {
Image(systemName: "plus")
}
)
}
}
}
struct DetailsView : View{
@ObservedObject var testObject : TestObject
var body : some View {
VStack {
Text(testObject.name ?? "")
}.navigationBarTitle("Detail")
.navigationBarItems(
trailing: HStack {
Button(action: {
self.testObject.isFavorite.toggle()
}) {
Image(systemName: self.testObject.isFavorite ? "heart.fill" : "heart")
}
}
)
}
}
И этот объект в файле xcdatamodeld:
Если я запускаю приложение в первый раз, я могу добавить новые объекты TestObject, нажав на значок «плюс» на панели навигации, которые затем будут добавлены в список. Если я затем коснусь одного из объектов, я перейду к DetailsView. В этом представлении нажатие кнопки NavigationBarButton с сердечком должно пометить объект как избранный, так что, если пользователь перейдет назад, он также отображается в первой части списка, избранное. Пока это работает, но у меня такой странный эффект:
Похоже, что автоматически запускается NavigationLink для дополнительного элемента в разделе избранного. Есть идеи, как я могу это исправить?
заранее спасибо