在 SwiftUI 中如何将 Fetched 对象传递给 CoreData 中的 DetailView

问题描述 投票:0回答:1

我是 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")
 ...
macos core-data swiftui-navigationsplitview
1个回答
0
投票

好吧,经过一些进一步的帮助和阅读,我自己找到了答案。

在 ContentView 中,用户被传递到 SecretDetailView,如下所示:

private var selectedUser: User {
    users.filter({ $0.id == selection.wrappedValue }).first! 
}

但这还不够,仍然会抛出错误。感谢这个 answer

Binding
不能用于
FetchRequest
/NSManagedObject
。在 SecretItemView 中
ObservedObject
是正确的选择:

@ObservedObject var user: User

希望我可以帮助其他有类似问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.