SwiftUI при нажатии кнопки вызова MKMapView.setRegion - PullRequest
2 голосов
/ 04 мая 2020

В NavigationView у меня есть Button и MKMapView (называемые MapView). Когда пользователь нажимает кнопку, карта должна приближаться к местоположению пользователя.

Я знаю, как использовать MKMapView.setRegion для увеличения местоположения пользователей, но я не могу понять, как правильно * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * Я не могу не знать, что я должен получить »(1018» »» »» ».

Если у меня есть какая-либо ссылка на мой MapView объект" ””, я могу вызвать setRegion, но я понимаю, что это обязательно ”. и теперь, когда я изучаю SwiftUI, вместо этого я пытаюсь мыслить декларативно.

Поэтому я считаю, что должен установить переменную State какого-либо типа и заставить MapView прослушивать изменения этой переменной. Но если мне удастся это сделать, то MapView вызов setRegion будет в любом случае обязательным.

Так что я здесь почесываю голову. Что мне делать?

struct ContentView: View {

    @State private var foo: Bool = false

    var body: some View {
        NavigationView {
            MapView()
                .navigationBarItems(trailing:
                    HStack {
                        Button(action: {
                            // zoom to user's location
                            self.foo.toggle()
                        }) {
                            Image(systemName: "location")
                        }
                })
        }
    }
}

struct MapView: UIViewRepresentable {

    @Binding var foo: Bool

    // if foo is changed, then call zoomToUserLocation()

    func zoomToUserLocation() {
        // ...
        mapView.setRegion(region, animated: true)
    }
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Вы можете использовать updateUIView метод UIViewRepresentable. Я бы использовал это так:

struct MapView: UIViewRepresentable {

    @Binding var foo: Bool

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

        if foo {
            self.zoomToUserLocation()
        }

    }

    func zoomToUserLocation() {
        // ...
        mapView.setRegion(region, animated: true)
    }
}

Вы также можете сделать что-то условное, как сказал Аспери.

0 голосов
/ 08 мая 2020

Непонятно, откуда вы берете region (или оно установлено), но при любом таком связывании изменяемый вызываемый объект updateUIView вызывается, поэтому вызов будет выполняться там и станет асинхронным, как показано ниже

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

    self.zoomToUserLocation()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...