0

我有以下数据模型:

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. 这目前不起作用。

有什么提示吗?

4

3 回答 3

0

在 中切换@ObservedObject到并初始化。Apple 文档。这连接了两个实例。@EnvironmentObjectDependantViewDependentView().environmentObject(imageModel)

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

struct MyImage: View{
    @ObservedObject var myImage: MyImage
    //Rest of code
}
于 2021-01-19T19:27:41.410 回答
0

您的子视图需要直接观察您的“MyImage”类以进行相应更新。将您的“MyImage”实例直接传递到观察到的对象变量中。这可能看起来像......

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

将图像参数传递给子视图中观察到的对象属性的位置。

于 2021-01-19T19:17:57.470 回答
0

感谢您的回复,非常感谢。我也试图创建一个引用该对象的子视图作为 ObservableObject,但失败了,因为我正在使用MapAnnotation并且使用该coordinate属性进行了初始化。需要详细弄清楚这里有什么区别,Apple 的文档对于一眼看出任何区别并没有太大帮助。我现在通过设置新的 UUID 使 MyImage 实例“无效”来使用某种解决方法:

class MyImage: : Identifiable, Equatable, ObservableObject {
    var id = UUID()

    var path: String
    @Published var coordinate: CLLocationCoordinate2D? {
        didSet {
            id = UUID()
        }
    }
}
于 2021-01-19T21:06:14.663 回答