core-data - 为什么 @FetchRequest 在 ContentView 中失败
问题描述
我的 SwiftUI ContentView 中有以下代码
struct ContentView: View {
@State private var search = ""
@State private var selectedBookID: Int64? = 0
@FetchRequest(entity: Books.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Books.bokName, ascending: true)])
var books: FetchedResults<Books>
var body: some View {
NavigationView {
VStack {
HStack {
NavigationLink("New book...", destination: BookView(isNew: true)).padding(.leading)
Spacer()
NavigationLink("Authors...", destination: AuthorView())
NavigationLink("Genres...", destination: GenreView()).padding(.trailing)
}.padding(.vertical)
TextField("Search...", text: $search).padding(.horizontal)
List(books, id: \Books.bokID, selection: $selectedBookID) { book in
NavigationLink(book.bokName!, destination: BookView(isNew: false)).buttonStyle(PlainButtonStyle())
}
}
}
}
}
并且它在应用程序启动期间失败,并出现错误“任何模型中没有 NSEntityDescriptions 声称 NSManagedObject 子类 'Books' 所以 +entity 很困惑。你加载你的 NSManagedObjectModel 了吗?”。它适用于同一应用程序中的所有其他视图。请注意,它是 macOS 应用程序。谢谢。
解决方案
我找到了方法 - 只需将 @FetchRequest 部分从 ContentView 中取出并将其放入额外的结构中,如下所示
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
HStack {
NavigationLink("New book...", destination: BookView(isNew: true)).padding(.leading)
Spacer()
NavigationLink("Authors...", destination: AuthorView())
NavigationLink("Genres...", destination: GenreView()).padding(.trailing)
}.padding(.vertical)
BookList()
}
}
}
}
struct BookList: View {
@State private var search = ""
@State private var selectedBookID: Int64? = 0
@FetchRequest(entity: Books.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Books.bokName, ascending: true)])
var books: FetchedResults<Books>
var body: some View {
TextField("Search...", text: $search).padding(.horizontal)
List(books, id: \Books.bokID, selection: $selectedBookID) { book in
NavigationLink(book.bokName!, destination: BookView(isNew: false)).buttonStyle(PlainButtonStyle())
}
}
}