导航到 NavigationLink 时如何重置 SwiftUI MapKit 坐标区域的中心?

How to reset a SwiftUI MapKit coordinate region's center when navigating to a NavigationLink?

有没有办法在出现时更新 MapView sheet/NavigationLink 的 MKCoordinateRegion?

我有一个视图正用于输入一些数据以根据街道地址创建 longitude/latitude 组合:

Create.swift:

@State var longitude:Double = -122.677579; // Default longitude
@State var latitude:Double = 45.515519;    // Default latitude
@State var streetAddress:String = "";      // Empty string
@State private var isShowing = false;

var body:some View {
  VStack {
    /* Take in the street address string via TextField */
    Button(action:{validate()}, label:"Next")
  }
   .sheet(isPresented:$isShowing) {
     LocationPicker(longitude:self.longitude, latitude:self.latitude)
   };
}

func validate() {
  var isValid:Bool = false;
  /*
    1. convert the street address to longitude and latitude
    2. store long/lat in self.longitude, self.latitude
    3. set isValid to true
  */
  isShowing = true;
}

流量:

  1. 接受用户的街道地址
  2. 单击 'next' 按钮通过将街道地址转换为 longitude/latitude
  3. 来验证街道地址
  4. 这些经度和纬度值存储在状态变量中
  5. isShowing 设置为 true,调出包含 LocationPicker 视图的 .sheet

LocationPicker.swift:

struct LocationPicker: View {
    @State var latitude:Double;
    @State var longitude:Double;
    var span:MKCoordinateSpan = MKCoordinateSpan(
        latitudeDelta: 0.009,
        longitudeDelta: 0.009
    )
    @State var region:MKCoordinateRegion;

    init(latitude:Double, longitude:Double) {
        _latitude = State(initialValue: latitude)
        _longitude = State(initialValue: longitude)
        _region = State(initialValue :MKCoordinateRegion(
            center: CLLocationCoordinate2D(latitude: latitude, longitude: longitude),
            span: self.span
            ))
    }

    var body:some View {
      Map(coordinateRegion: $region,
          showsUserLocation: false
      )
      /* ... */
    }
}

此配置的问题是 Create.swift 中的 .sheetLocationPicker 在呈现 Create.swift 视图时被呈现。所以当我把longitude/latitude的状态传给sheet的LocationPicker的时候,传的是默认值,打开地图时出现的中心点是默认坐标,而不是由 validate().

中的 streetAddress 生成

我尝试在 Create.swift 中同时使用不可见的 NavigationLink.sheet,但两者都与父对象同时呈现。我尝试使用 @Binding 双打 LocationPicker.swift:

struct LocationPicker: View {
    @Binding var latitude:Double;
    @Binding var longitude:Double;
    var span:MKCoordinateSpan = MKCoordinateSpan(
        latitudeDelta: 0.009,
        longitudeDelta: 0.009
    )
    @State var region:MKCoordinateRegion;

    init(latitude:Binding<Double>, longitude:Binding<Double>) {
        _latitude = latitude
        _longitude = longitude
        _region = State(initialValue :MKCoordinateRegion(
            center: CLLocationCoordinate2D(latitude: latitude, longitude: longitude),
            span: self.span
            ))
    }

    var body:some View {
      Map(coordinateRegion: $region,
          showsUserLocation: false
      )
      /* ... */
    }

但是,CLLocationCoordinate2D 不接受 Binding<Double> 作为纬度或经度的数据类型。

当您将 Binding 传递给 init 时,如果您需要使用 Binding 中包含的值,则必须使用 .wrappedValue 来访问基础值。在这种情况下,您传入两个 Binding<Double> 并试图使用它们创建一个 CLLocationCoordinate2D,因此初始化程序必须如下所示:

init(latitude:Binding<Double>, longitude:Binding<Double>) {
    // Binding
    _latitude = latitude
    // Binding
    _longitude = longitude
    _region = State(initialValue :MKCoordinateRegion(
                                                 // not Bindings
        center: CLLocationCoordinate2D(latitude: latitude.wrappedValue, longitude: longitude.wrappedValue),
        span: self.span
        ))
}