SwiftUI:为什么我的数据改变属性不刷新UI?



我有以下数据模型:

class MyImage: : Identifiable, Equatable, ObservableObject {
let id = UUID()
var path: String
@Published var coordinate: CLLocationCoordinate2D?
}
class MyImageCollection : ObservableObject {
@Published var images: [MyImage] = []
@Published var selection: Set<UUID> = []
}
extension Array where Element == MyImage {
func haveCoordinates() -> Array<MyImage> {
return filter { (image) -> Bool in
return image.coordinate != nil
}
}
}

我在视图中使用集合如下:

# Top View
@StateObject var imageModel: MyImageCollection = MyImageCollection()
# Dependend Views
@ObservedObject var imageModel: MyImageCollection

所以在我的SwiftUI中,每当我通过imageCollection.images.append(anImage)添加一个新的MyImage实例时,一切都工作得很好,任何视图都相应地更新,任何使用imageCollection.haveCoordinates()的视图都更新了。但我也想有任何视图更新,当我改变像imageCollection.images[0].coordinate = someCoordinate图像的属性。

提示吗?

你的子视图需要直接观察你的'MyImage'类进行相应的更新。将你的MyImage实例直接传递到一个观察对象变量中。这是它可能的样子…

ForEach(collection.images) { myImage in
YourSubView(image: myImage)
}

其中图像参数被传递给子视图中的观察对象属性。

DependantView中的@ObservedObject切换为@EnvironmentObject,初始化DependentView().environmentObject(imageModel)。苹果公司文档。这连接了两个实例。

同样,如果你想观察每个MyImage,你必须创建一个直接观察它的MyImageView

struct MyImage: View{
@ObservedObject var myImage: MyImage
//Rest of code
}

感谢您的回复,非常感谢。我试图创建一个引用对象作为ObservableObject的子视图,但失败了,因为我使用MapAnnotation,并与coordinate属性初始化。如果你需要弄清楚两者之间的具体区别,苹果的文档并不能帮助你一眼看出两者之间的区别。我现在正在使用某种变通方法,通过"invalidating"设置一个新的UUID的MyImage实例:

class MyImage: : Identifiable, Equatable, ObservableObject {
var id = UUID()
var path: String
@Published var coordinate: CLLocationCoordinate2D? {
didSet {
id = UUID()
}
}
}

最新更新