无法转换“FetchedResults<User>.Element”类型的返回表达式? (又名“Optional<User>”)返回类型“Binding<User>”

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

当在侧边栏视图中选择用户时,我尝试将获取的对象

User
传递到我的详细视图。我不明白错误消息:

Cannot convert return expression of type 'FetchedResults<User>.Element?' (aka 'Optional<User>') to return type 'Binding<User>'
.

我的内容视图:

struct ContentView: View {

 @Environment(\.managedObjectContext) var moc

 @FetchRequest(sortDescriptors: [SortDescriptor(\.name)])
 private var users: FetchedResults<User>

 @State private var selectedUserID: User.ID?
 @State private var defaultUserID: User.ID?

 var body: some View {
    NavigationSplitView {
        SidebarView(selection: selection)
        
    } detail: {
        if selection.wrappedValue != nil {
            SecretDetailView(user: selectedUser)    //<-- passing user object to sub-view
        } else {
            Text("Please select a user")
        }
    }
 }


 private var selection: Binding<User.ID?> {
    Binding(get: { selectedUserID ?? defaultUserID }, set: { selectedUserID = $0 })
 }

 private var selectedUser: Binding<User> {
    users.filter({ $0.id == selection.wrappedValue }).first   //<-- ERROR!
 }
}

我的详细信息-使用用户绑定查看:

struct SecretDetailView: View {

 @Binding var user: User                      //<-- user Binding in sub-view

 var secretItems: [SecretItem] {
    return user.secretItems
        .filter {
            searchText.isEmpty ? true : $0.userName.localizedCaseInsensitiveContains(searchText)
        }
        .sorted(using: sortOrder)
 }

 @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)

        TableColumn("Password", value: \.password) { secretItem in
            Text(secretItem.password)
        }
    } rows: {
        ForEach(secretItems) { secretItem in
            TableRow(secretItem)
        }
    }
 }

 var body: some View {
    
    ZStack(alignment: .bottom) {
        
        table
            .searchable(text: $searchText)
            .navigationTitle(user.name!)
....
macos swiftui core-data binding
1个回答
0
投票

Binding
FetchRequest
/
NSManagedObject
是一个谬误。

FetchRequest
是只读的,
Binding
适用于值类型。

改变

FetchRequest
的唯一方法是直接影响商店。

您需要的是

@ObservedObject var user: User

编辑并查看更改

NSManagedObject

你可以使用

@State private var selectedUser:User?

但是您将无法观察到刚刚更改为

selectedUser
的对象整体属性的变化。

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