为啥 SwiftUI ObservedObject 不能在列表行中工作?
Posted
技术标签:
【中文标题】为啥 SwiftUI ObservedObject 不能在列表行中工作?【英文标题】:Why would SwiftUI ObservedObject not work in a List Row?为什么 SwiftUI ObservedObject 不能在列表行中工作? 【发布时间】:2019-11-20 07:16:47 【问题描述】:我遇到了一个问题,即主窗格列表视图行在 iPad 中没有正确更新。我已将用于描述目的的代码缩减为
struct CarsList : View
@State var isPresented = false
@FetchRequest(fetchRequest: Car.allCarsFetchRequest())
var cars: FetchedResults<Car>
var body: some View
NavigationView
List
Button("Add Car")
self.isPresented.toggle()
ForEach (self.cars) car in
VStack
Text ("List Car name: \(car.name!)")
NavigationLink(destination: CarDetailView(carVM: CarViewModel(car: car)) )
CarRowView(car: car)
.sheet(isPresented: $isPresented, onDismiss: , content:
CarDetailView(carVM: CarViewModel())
)
iPad 左侧窗格显示汽车名称列表(CoreData 托管对象)。出于测试目的,我在 Text(“List car name...”) 中显示了两次名称,然后在 CarRowView 中再次显示了名称。 CarRowView 有 car: Car 声明为 ObservedObject。 我可以点击一行,进入详细视图,我可以在其中更改汽车名称。当我这样做时,列表会更新为 Text(“List car name...”) 显示新名称,但 CarRowView 不会更改。 因此,更改详细信息窗格中的“汽车”,立即显示在列表中(在 Text("List car name..") 中),但即使该汽车对象被发送到 CarRowView,它是一个 ObservedObject,CarRowView显示不变。 该应用程序使用 CloudKit,在我进行更改后,新名称在运行相同代码的 iPhone(在 CarRowView 中)上显示正常。任何想法为什么 CarRowView 不会在 iPad 的主窗格上更新?
【问题讨论】:
阅读例如this主题...并且,一般来说,尝试搜索 - 这里有很多类似的主题 感谢您的阅读。但是,我认为 fetchrequest 没有问题——List 确实在 TextView 中显示了对“car”的更改——并将更改后的“car”发送到 CarRowView,但 CarRowView 没有显示更改。 我的 iPad 从 13.2 更新到 13.3 - 现在可以正常使用了!! 【参考方案1】:看起来这是一个 SwiftUI 错误,而不是代码的问题,因为它现在适用于 13.3。
【讨论】:
以上是关于为啥 SwiftUI ObservedObject 不能在列表行中工作?的主要内容,如果未能解决你的问题,请参考以下文章
通用结构 'ObservedObject' 要求 'Video' 符合 SwiftUI 中的 'ObservableObject'
SwiftUI - 尽管使用了 @Published 和 @ObservedObject,但视图不会更新
SwiftUI:如何在 Pageable 中访问 ObservedObject?
SwiftUI - ObservedObject 永远不会被释放