gpt4 book ai didi

SwiftUI @Binding 不刷新 View

转载 作者:行者123 更新时间:2023-12-04 19:25:58 41 4
gpt4 key购买 nike

我有一个简单的主/详细界面,其中详细 View 修改数组中的项目。使用下面的方法,模型会正确更新,但 SwiftUI 不会刷新 View 以反射(reflect)更改。

模型:

struct ProduceItem: Identifiable {
let id = UUID()
let name: String
var inventory: Int
}

final class ItemStore: BindableObject {
var willChange = PassthroughSubject<Void, Never>()

var items: [ProduceItem] { willSet { willChange.send() } }

init(_ items: [ProduceItem]) {
self.items = items
}
}

显示 ProduceItems 列表的主视图(ItemStore 被插入到 SceneDelegate 中的环境中):

struct ItemList: View {
@EnvironmentObject var itemStore: ItemStore

var body: some View {
NavigationView {
List(itemStore.items.indices) { index in
NavigationLink(destination: ItemDetail(item: self.$itemStore.items[index])) {
VStack(alignment: .leading) {
Text(self.itemStore.items[index].name)
Text("\(self.itemStore.items[index].inventory)")
.font(.caption)
.foregroundColor(.secondary)
}
}
}
.navigationBarTitle("Items")
}
}
}

详细 View ,可让您更改项目的库存值:

struct ItemDetail: View {
@Binding var item: ProduceItem

var body: some View {
NavigationView {
Stepper(value: $item.inventory) {
Text("Inventory is \(item.inventory)")
}
.padding()
.navigationBarTitle(item.name)
}
}
}

在 ItemDetail View 中点击步进器会修改商店中的项目,但步进器的文本不会更改。导航回列表确认模型已更改。另外,我确认商店调用 willChange.send()给它的出版商。我会假设 send()调用更新环境中的 ItemStore 和详细 View 的 @Binding属性应该被通知更改并刷新显示(但它没有)。

我尝试将 ItemDetail 的 item 属性更改为使用 @State :

@State var item: ProduceItem = ProduceItem(name: "Plums", inventory: 7)

在这种情况下,模型是在使用步进器时更新的,并且 View 被刷新,显示更新的库存。谁能解释为什么使用 @Binding属性不会刷新界面,而是本地的 @State属性(property)呢?

最佳答案

在这里,您有一个解决方法。调用 ItemDetail 时使用索引,而不是元素。在 ItemDetail 中,您使用 @EnvironmentObject .

struct ItemList: View {
@EnvironmentObject var itemStore: ItemStore

var body: some View {
NavigationView {
List(itemStore.items.indices) { index in
NavigationLink(destination: ItemDetail(idx: index)) {
VStack(alignment: .leading) {
Text(self.itemStore.items[index].name)
Text("\(self.itemStore.items[index].inventory)")
.font(.caption)
.foregroundColor(.secondary)
}
}
}
.navigationBarTitle("Items")
}
}
}

struct ItemDetail: View {
@EnvironmentObject var itemStore: ItemStore
let idx: Int


var body: some View {
NavigationView {
Stepper(value: $itemStore.items[idx].inventory) {
Text("Inventory is \(self.itemStore.items[idx].inventory)")
}
.padding()
.navigationBarTitle(itemStore.items[idx].name)
}
}
}

关于SwiftUI @Binding 不刷新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57127878/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com