UIViewRepresentable.updateUIView (_: context :) не вызывается при изменении @State, @Binding или @EnvironmentObject - PullRequest
1 голос
/ 20 октября 2019

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 (). Практически звонок происходит только тогда, когда я выхожу из приложения по кнопке «домой» (и снова захожу)

...