我正在开发 SwiftUI 并使用 UIViewRepresentable 显示 MapView。 现在,当加载 map 时,我正在计算两点之间的路线,并将该路线存储在模型中。
class MapInfo: ObservableObject {
@Published var routeArray: [RouteArray] = []
}
我正在调用 UIViewRepresentable MapCoordinator 中的calculateRoute()函数
struct MapView: UIViewRepresentable {
@StateObject var mapInfo = MapInfo()
}
func requestRoute() {
// when response is received
parentView.mapView.mapInfo.routeArray = responseArray
}
但我的问题是更新 MapInfo @Published RouteArray 时未调用 SwiftUI View onReceive。
我已经添加了我的代码。
struct MapContainerView: View {
@ObservedObject var mapInfoObj = MapInfo()
var body: some View {
ZStack {
MapView()
}.onReceive(mapInfoObj.$routeArray) { updatedRouteArray in
print(updatedRouteArray)
}
}
}
对此的任何帮助都将受到高度赞赏。 谢谢:)
最佳答案
正如 @Paulw11 在评论中提到的,您正在使用 MapInfo
的不同实例,这意味着更新一个实例不会更新另一个实例,因为它们是不同的。
要解决此问题,您只需在 MapContainerView
中创建一个 MapInfo
实例,然后将其传递到您的 MapContainerView
View ,这样两个 View 可以共享相同的数据并在数据更改时更新。
您的代码如下所示:
1。 map View
struct MapView: UIViewRepresentable {
@ObservedObject var mapInfo: MapInfo
}
func requestRoute() {
// when response is received
parentView.mapView.mapInfo.routeArray = responseArray
}
2。 map 容器 View
struct MapContainerView: View {
@StateObject var mapInfoObj = MapInfo()
var body: some View {
ZStack {
// Here now, the two views are sharing the same data
MapView(mapInfo: mapInfoObj)
}.onReceive(mapInfoObj.$routeArray) { updatedRouteArray in
print(updatedRouteArray)
}
}
}
关于ios - @Published ObservableObject 不更新 SwiftUI View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68739056/