将观察对象的投影值 属性 传递给 @Binding
Pass an observed object's projected value's property to @Binding
我有一个 @FetchRequest
和 returns 一个 FetchResult<Item>
的主屏幕。 In that main screen I have a list of all of the items with navigation links that, when selected, pass an Item
to an ItemDetail
view.在此 ItemDetail
视图中,项目标记为 @ObservedObject
。 ItemDetail
的子视图是 ItemPropertiesView
,它列出了项目的所有属性。我使用 $item.{insert property here}
将项目属性直接传递给 ItemPropertiesView
的 @Binding
属性。在 ItemPropertiesView 中,有几个 LineItem
,我再次使用 $ 将 属性 传递给一个名为“value”的 @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 的新手,非常感谢所有反馈。
仅通过代码阅读,我认为问题出在 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 = [=11=] }
)
return ItemPropertiesView(itemCost: binding)
}
}
我有一个 @FetchRequest
和 returns 一个 FetchResult<Item>
的主屏幕。 In that main screen I have a list of all of the items with navigation links that, when selected, pass an Item
to an ItemDetail
view.在此 ItemDetail
视图中,项目标记为 @ObservedObject
。 ItemDetail
的子视图是 ItemPropertiesView
,它列出了项目的所有属性。我使用 $item.{insert property here}
将项目属性直接传递给 ItemPropertiesView
的 @Binding
属性。在 ItemPropertiesView 中,有几个 LineItem
,我再次使用 $ 将 属性 传递给一个名为“value”的 @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 的新手,非常感谢所有反馈。
仅通过代码阅读,我认为问题出在 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 = [=11=] }
)
return ItemPropertiesView(itemCost: binding)
}
}