我有以下数据模型:
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()
}
}
}