SwiftUI on按钮点击调用MKMapView.setRegion

SwiftUI on按钮点击调用MKMapView.setRegion,swiftui,Swiftui,在导航视图中我有一个按钮和一个MKMapView(称为MapView)。当用户点击按钮时,地图应缩放到用户的位置 我知道如何使用MKMapView.setRegion缩放到用户的位置,但我不知道如何正确地让MapView意识到当用户点击按钮时它应该执行此操作 如果我以某种方式引用了我的MapView对象,我可以调用setRegion,但我意识到这是必要的,现在当我学习SwiftUI时,我尝试以声明的方式思考 因此,我认为应该设置某种类型的状态变量,并使MapView侦听对该变量的更改。但如果我能

导航视图中
我有一个
按钮
和一个
MKMapView
(称为
MapView
)。当用户点击按钮时,地图应缩放到用户的位置

我知道如何使用
MKMapView.setRegion
缩放到用户的位置,但我不知道如何正确地让
MapView
意识到当用户点击按钮时它应该执行此操作

如果我以某种方式引用了我的
MapView
对象,我可以调用
setRegion
,但我意识到这是必要的,现在当我学习SwiftUI时,我尝试以声明的方式思考

因此,我认为应该设置某种类型的
状态
变量,并使
MapView
侦听对该变量的更改。但如果我能做到这一点,那么无论如何调用
setRegion
都是必要的

所以我在这里挠头。我该怎么办

struct ContentView:View{
@国家私有变量foo:Bool=false
var body:一些观点{
导航视图{
地图视图()
.navigationBarItems(尾部:
HStack{
按钮(操作:{
//缩放到用户的位置
self.foo.toggle()
}) {
图像(系统名称:“位置”)
}
})
}
}
}
结构映射视图:UIViewRepresentable{
@绑定变量foo:Bool
//如果更改了foo,则调用zoomToUserLocation()
func zoomToUserLocation(){
// ...
mapView.setRegion(区域,动画:true)
}
}

不清楚从何处获取
区域(或设置),但在任何这样的绑定上,都会调用representable的
updateUIView
,因此会在那里进行调用并使其异步,如下所示

func updateUIView(_ uiView: MKMapView, context: Context) {
    // if needed make something conditional here on `foo`

    self.zoomToUserLocation()
}

您可以使用UIViewRepresentable的
updateUIView
方法。我会这样使用它:

struct MapView: UIViewRepresentable {

    @Binding var foo: Bool

    func updateUIView(_ uiView: MKMapView, context: Context) {

        if foo {
            self.zoomToUserLocation()
        }

    }

    func zoomToUserLocation() {
        // ...
        mapView.setRegion(region, animated: true)
    }
}
你也可以做一些有条件的事情,就像Asperi说的