【问题标题】:@Published ObservableObject not updating SwiftUI View@Published ObservableObject 未更新 SwiftUI 视图
【发布时间】:2021-10-14 17:46:33
【问题描述】:

我正在开发 SwiftUI 并使用 UIViewRepresentable 显示 MapView。 现在,当加载地图时,我正在计算两点之间的路线,并将该路线存储在模型中。

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
}

但我的问题是 SwiftUI View onReceive 在 MapInfo @Published RouteArray 更新时没有被调用。

我已经添加了我的代码。

struct MapContainerView: View {
      @ObservedObject var mapInfoObj = MapInfo()
      
      var body: some View {
          ZStack {
             MapView()
          }.onReceive(mapInfoObj.$routeArray) { updatedRouteArray in
             print(updatedRouteArray)
          }
      }

}

对此的任何帮助都非常感谢。 谢谢你:)

【问题讨论】:

  • 您有两个不同的MapInfo 实例。您需要通过其初始化程序将 MapContainerView 中的那个传递给您的 MapView
  • 是的,你是对的@Paulw11。我的错!!我错过了这个基本的东西。谢谢你:)

标签: ios swiftui uiviewrepresentable


【解决方案1】:

正如 @Paulw11 在 cmets 中提到的,您使用的是 MapInfo 的不同实例,这仅仅意味着更新一个实例不会更新另一个实例,因为它们是不同的。

要解决此问题,您只需在 MapContainerView 中创建 MapInfo 的一个实例,然后将其传递给您的 MapContainerView 视图,以便两个视图可以共享相同的数据并在数据更改时进行更新。

您的代码如下所示:

1。地图视图

struct MapView: UIViewRepresentable {
  @ObservedObject var mapInfo: MapInfo
}

func requestRoute() {
    // when response is received 
    parentView.mapView.mapInfo.routeArray = responseArray
}

2。地图容器视图

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)
          }
      }

}

【讨论】:

  • 是的,你是对的@cedricbahirwe。我的错!!我错过了这个基本的东西。谢谢你:)
  • 快乐都是我的
【解决方案2】:

如上所述,我错过了在不同视图之间共享变量。

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)
      }
   }
  }

【讨论】:

    猜你喜欢
    • 2020-01-07
    • 2020-07-31
    • 2020-10-21
    • 2021-03-23
    • 2021-09-07
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多