UIViewRepresentable.updateUIView не вызывается при изменении ObservableObject, от которого зависит это представление и его родительское представление.
У меня есть GameView, у которого есть «@State var locationManager: LocationManager», который передается моему MapViewв качестве обязательного. MapView соответствует протоколу UIViewRepresentable. LocationManager соответствует, среди прочего, ObservableObject и имеет следующий код, связанный с соответствием:
var didChange = PassthroughSubject<locationmanager, Never>()
var lastKnownLocation: CLLocation {
didSet {
// Propagate the update to the observers.
didChange.send(self)
print("Finished propagating lastKnownLocation to the observers.")
}
}
Я полагаю, что GameView и, следовательно, MapView должны обновляться каждый раз, когда LocationManager.lastKnownLocation изменяется. На практике я вижу только MapView.updateUIView (), который вызывается при выходе из приложения для кнопки «Домой». В этот момент управление попадает в updateUIView (), и когда я снова открываю приложение (не compile-install-run), я получаю обновление. Это также происходит однажды вскоре после того, как GameView () был представлен.
Правильно ли я понимаю, как SwiftUI работает неправильно, или это какая-то ошибка? Как я правильно понял?
struct GameView: View {
@State var locationManager: LocationManager
var body: some View {
MapView(locationManager: $locationManager)
}
}
struct MapView: UIViewRepresentable {
@Binding var locationManager: LocationManager
func makeUIView(context: Context) -> GMSMapView{ ... }
func updateUIView(_ mapView: GMSMapView, context: Context) { ... }
}
class LocationManager: NSObject, CLLocationManagerDelegate, ObservableObject {
var didChange = PassthroughSubject<LocationManager, Never>()
var lastKnownLocation: CLLocation {
didSet {
// Propagate the update to the observers.
didChange.send(self)
print("Finished propagating lastKnownLocation to the observers.")
}
}
...
}
Я ожидаю, что каждый тайм LocationManager.lastKnownLocation изменяется, вызывается MapView.updateUIView (). Практически звонок происходит только тогда, когда я выхожу из приложения по кнопке «домой» (и снова захожу)