【发布时间】:2020-11-24 20:12:46
【问题描述】:
我在 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 文件中的这个实体:
如果我是第一次启动应用程序,我可以通过点击 NavigationBar 中的加号图像来添加新的 TestObjects,然后将其添加到列表中。如果我然后点击其中一个对象,我会导航到 DetailsView。在此视图上,用心脏点击 NavigationBarButton 应该将该对象标记为收藏,这样如果用户向后导航,这也会显示在列表的第一部分,即收藏夹。到目前为止它有效,但我有这个奇怪的效果:
似乎收藏夹部分中额外元素的 NavigationLink 已自动触发。知道如何解决这个问题吗?
提前致谢
【问题讨论】:
-
以下主题似乎应该有帮助stackoverflow.com/a/61153180/12299030
标签: core-data swiftui swiftui-list swiftui-navigationlink