Combine with SwiftUIを学習しようとしていますが、UIKitからのビューをObservableObject
(以前はBindableObject
)で更新する方法に苦労しています。問題は、メソッドupdateUIView
が@Published
オブジェクトは、変更された通知を送信します。
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)
}
}
そのlocationCoordinates
配列をビューにバインドして、更新するたびに新しいポイントが実際に追加されるようにする方法を教えてください。
このソリューションは私にとってはうまくいきましたが、EnvironmentObject https://Gist.github.com/svanimpe/152e6539cd371a9ae0cfee42b374d7c4