SwiftUI中的ObservedObject不能直接在列表行中工作的原因是,ObservedObject是一种用于在视图之间共享数据的属性包装器。在列表中,每个行都是独立的视图实例,它们具有自己的生命周期。当列表行被重新加载或复用时,ObservedObject实例会被重新创建,导致数据丢失或不一致。
为了解决这个问题,可以使用ForEach视图和Identifiable协议来创建列表行,并将ObservedObject作为参数传递给行视图。这样,每个行视图都可以共享相同的ObservedObject实例,确保数据的一致性。
以下是一个示例代码:
struct ContentView: View {
@ObservedObject var dataModel = DataModel()
var body: some View {
List {
ForEach(dataModel.items) { item in
RowView(item: item)
}
}
}
}
struct RowView: View {
@ObservedObject var item: Item
var body: some View {
Text(item.name)
}
}
class DataModel: ObservableObject {
@Published var items: [Item] = []
init() {
// 初始化数据
}
}
struct Item: Identifiable {
let id = UUID()
let name: String
}
在这个示例中,ContentView视图使用@ObservedObject属性包装器来创建一个DataModel实例。然后,使用ForEach视图和Identifiable协议来遍历DataModel中的items数组,并将每个item传递给RowView视图。RowView视图使用@ObservedObject属性包装器来观察item对象的变化,并显示item的名称。
这样,无论列表行如何重新加载或复用,ObservedObject都会保持一致,并且可以正确地更新和显示数据。
腾讯云相关产品和产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云