web-dev-qa-db-fra.com

Comment mettre à jour UIViewRepresentable avec ObservableObject

J'essaie d'apprendre Combine avec SwiftUI et je n'arrive pas à mettre à jour ma vue (depuis UIKit) avec ObservableObject (auparavant BindableObject). Le problème est que, évidemment, la méthode updateUIView ne se déclenchera pas une fois que le @Published l'objet envoie la notification de sa modification.

class DataSource: ObservableObject {
    @Published var locationCoordinates = [CLLocationCoordinate2D]()
    var value: Int = 0

    init() {
        Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { timer in
            self.value += 1
            self.locationCoordinates.append(CLLocationCoordinate2D(latitude: 52, longitude: 16+0.1*Double(self.value)))
        }
    }
}

struct MyView: UIViewRepresentable {
    @ObservedObject var dataSource = DataSource()

    func makeUIView(context: Context) -> MKMapView {
        MKMapView(frame: .zero)
    }

    func updateUIView(_ view: MKMapView, context: Context) {
        let newestCoordinate = dataSource.locationCoordinates.last ?? CLLocationCoordinate2D(latitude: 52, longitude: 16)
        let annotation = MKPointAnnotation()
        annotation.coordinate = newestCoordinate
        annotation.title = "Test #\(dataSource.value)"
        view.addAnnotation(annotation)
    }
}

Comment lier ce tableau locationCoordinates à la vue de telle manière qu'un nouveau point soit en fait ajouté à chaque rafraîchissement?

9
Vive

cette solution a fonctionné pour moi mais avec EnvironmentObject https://Gist.github.com/svanimpe/152e6539cd371a9ae0cfee42b374d7c4

0
Krzysztof Dziuba