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?
cette solution a fonctionné pour moi mais avec EnvironmentObject https://Gist.github.com/svanimpe/152e6539cd371a9ae0cfee42b374d7c4