我是 SwiftUI 和 CoreData 的新手,我尝试在我的
macos
应用程序中使用 CoreData 实现持久性。现在,我坚持设法将所选项目从 SidebarView
传递到 DetailView
内的 NavigationSplitView
。
非持久性 ObservableObject
DataStore
替换为包含实体 UserDataModel
和 User
的持久性 SecretItem
。
如何将
User
中选定的SidebarView
传递到SecretDetailView
以显示所选用户的详细信息?
谢谢!
我的
ContentView
:
import SwiftUI
struct ContentView: View {
@Environment(\.managedObjectContext) var moc
@FetchRequest(sortDescriptors: [SortDescriptor(\.name)])
private var users: FetchedResults<User>
//@EnvironmentObject var dataStore: DataStore <-- old non-persistante Datastore
@State private var selectedUserID: User.ID?
@State private var defaultUserID: User.ID?
var body: some View {
NavigationSplitView {
SidebarView(selection: selection)
} detail: {
SecretDetailView(user: selectedUser)
}
}
private var selection: Binding<User.ID?> {
Binding(get: { selectedUserID ?? defaultUserID }, set: { selectedUserID = $0 })
}
private var selectedUser: Binding<User> {
//$dataStore[selection.wrappedValue]
??? <-- here I'm struggling
}
我的
SecretDetailView
:
import SwiftUI
struct SecretDetailView: View {
@Environment(\.managedObjectContext) var moc
@FetchRequest(sortDescriptors: [SortDescriptor(\.userName)])
var secretItem: FetchedResults<SecretItem>
@Binding var user: User <-- the Binding used in ContentView
@State var searchText: String = ""
@State private var selection = Set<SecretItem.ID>()
@State var sortOrder: [KeyPathComparator<SecretItem>] = [
.init(\.userName, order: SortOrder.forward)
]
var table: some View {
Table(selection: $selection, sortOrder: $sortOrder) {
TableColumn("User Name", value: \.userName)
...
var body: some View {
ZStack(alignment: .bottom) {
table
.searchable(text: $searchText)
.navigationTitle(user.name!)
//.navigationSubtitle("file: kpoph")
...
好吧,经过一些进一步的帮助和阅读,我自己找到了答案。
在 ContentView 中,用户被传递到 SecretDetailView,如下所示:
private var selectedUser: User {
users.filter({ $0.id == selection.wrappedValue }).first!
}
但这还不够,仍然会抛出错误。感谢这个 answer
Binding
不能用于 FetchRequest
/NSManagedObject
。在 SecretItemView 中ObservedObject
是正确的选择:
@ObservedObject var user: User
希望我可以帮助其他有类似问题的人。