SwiftUI@Binding不';刷新视图

SwiftUI@Binding不';刷新视图,swiftui,combine,Swiftui,Combine,我有一个简单的主/细节界面,其中细节视图修改数组中的项目。使用以下命令,可以正确更新模型,但SwiftUI不会刷新视图以反映更改 型号: struct ProduceItem:可识别{ 设id=UUID() let name:String var存货:整数 } 最终类ItemStore:BindableObject{ var willChange=PassthroughSubject() 变量项:[ProduceItem]{willSet{willChange.send()} 初始化(uItem

我有一个简单的主/细节界面,其中细节视图修改数组中的项目。使用以下命令,可以正确更新模型,但SwiftUI不会刷新视图以反映更改

型号:

struct ProduceItem:可识别{
设id=UUID()
let name:String
var存货:整数
}
最终类ItemStore:BindableObject{
var willChange=PassthroughSubject()
变量项:[ProduceItem]{willSet{willChange.send()}
初始化(uItems:[ProduceItem]){
self.items=项目
}
}
显示ProduceItems列表的主视图(将ItemStore插入到SceneDelegate中的环境中):

struct ItemList:视图{
@环境对象变量itemStore:itemStore
var body:一些观点{
导航视图{
列表(itemStore.items.index){中的索引
导航链接(目标:ItemDetail(项:self.$itemStore.items[index])){
VStack(对齐:。前导){
文本(self.itemStore.items[index].name)
文本(\(self.itemStore.items[index.inventory)])
.font(.caption)
.foregroundColor(.secondary)
}
}
}
.navigationBarTitle(“项目”)
}
}
}
用于更改项目库存值的详细视图:

struct itemdail:View{
@绑定变量项:ProduceItem
var body:一些观点{
导航视图{
步进器(值:$item.inventory){
文本(“库存为\(项目.库存)”)
}
.padding()
.navigationBarTitle(项目名称)
}
}
}
点击ItemDetail视图中的步进器可修改存储中的项目,但步进器的文本不会更改。导航回列表可确认模型已更改。此外,我还确认商店将调用
willChange.send()
发送给它的发布者。我假设
send()
调用会更新环境中的ItemStore,并且应该通知详细视图的
@Binding
属性该更改并刷新显示(但它不会)

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

@State var item:ProduceItem=ProduceItem(名称:“李子”,库存:7)

在这种情况下,当使用步进器时,将更新模型项目,并刷新视图,显示更新的库存。有人能解释为什么使用
@Binding
属性不会刷新界面,而使用本地
@State
属性会刷新界面吗?

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

struct ItemList:视图{
@环境对象变量itemStore:itemStore
var body:一些观点{
导航视图{
列表(itemStore.items.index){中的索引
导航链接(目的地:ItemDetail(idx:索引)){
VStack(对齐:。前导){
文本(self.itemStore.items[index].name)
文本(\(self.itemStore.items[index.inventory)])
.font(.caption)
.foregroundColor(.secondary)
}
}
}
.navigationBarTitle(“项目”)
}
}
}
结构项详细信息:视图{
@环境对象变量itemStore:itemStore
让idx:Int
var body:一些观点{
导航视图{
步进器(值:$itemStore.items[idx].inventory){
文本(“库存为\(self.itemStore.items[idx].Inventory)”)
}
.padding()
.navigationBarTitle(itemStore.items[idx].name)
}
}
}

Hi@smr,我看到了一些非常类似的东西,我也发布了一个问题:我仍然需要看看问题是否仍然存在于beta 4中,但看到你的问题,它可能存在:-(我上周一直在玩这个。昨晚我发现了NavigationLink(目的地…)不会自动更新它显示的数据。我使用相同的self.itemStore.items创建了第二个列表,当详细数据更改时,它会自动更新,但同一页面上使用导航链接的相同列表没有。Hmmm…似乎是另一个问题。当我运行上面的代码时(没有@kontiki的解决方法),它会在导航回列表(beta 4)时更新列表。你也得到了同样的结果吗?是的,就是这样。它还修复了在我的版本中被破坏的预览。谢谢你的解决方案!