2

我有一个@FetchRequest返回 a的主屏幕FetchResult<Item>。In that main screen I have a list of all of the items with navigation links that, when selected, pass an Itemto an ItemDetailview. 在此ItemDetail视图中,项目标有@ObservedObjectItemDetail的子视图ItemPropertiesView列出了所有项目的属性。我将项目属性直接传递给using的@Binding属性。在 ItemPropertiesView 中,有几个地方我再次使用 $ 将属性传递给名为“value”的属性,该属性被传递到文本字段中,最终可以更改。ItemPropertiesView$item.{insert property here}LineItem@Binding

我的目标是能够编辑此文本字段,并且在您完成编辑后,能够将这些更改保存到我的核心数据存储中。

由于这有点难以阅读,这里是一个代码娱乐:

struct MainScreen: View {
    @FetchRequest(entity: Item.entity(), sortDescriptors: [NSSortDescriptor(key: "itemName", ascending: true)]) var items: FetchedResults<Item>
    var body: some View {
        NavigationView {
            List {
                ForEach(items, id: \.self) { (item: Item) in
                    NavigationLink(destination: ItemDetail(item: item)) {
                        Text(item.itemName ?? "Unknown Item Name")
                    }
                } // ForEach
            }
        }
    } // body
} // MainScreen

struct ItemDetail: View {
    @ObservedObject var item: Item

    var body: some View {
        ItemPropertiesView(itemCost: $item.itemCost)
    }
}

struct ItemPropertiesView: View {
    @Binding var itemCost: String?

    var body: some View {
        LineItem(identifier: "Item Cost", value: $itemCost)
    }
}

struct LineItem: View {
    let identifier: String
    @Binding var value: String

    var body: some View {
        HStack {
            Text(identifier).bold() + Text(": ")
            TextField("Enter value",text: $value)
        }
    }
}

我在 ItemDetail 中收到错误:“编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式”

这是我得到的唯一错误。我是 SwiftUI 的新手,因此感谢所有反馈。

4

1 回答 1

1

仅通过阅读代码,我认为问题出在可选属性中ItemPropertiesView,只需将其删除

struct ItemPropertiesView: View {
    @Binding var itemCost: String      // << here !!
    // .. other code

并更新父级以桥接到 CoreData 模型可选属性

struct ItemDetail: View {
    @ObservedObject var item: Item

    var body: some View {
        let binding = Binding(
            get: { self.item.itemCost ?? "" },
            set: { self.item.itemCost = $0 }
        )
        return ItemPropertiesView(itemCost: binding)
    }
}
于 2020-08-15T17:24:43.453 回答