web-dev-qa-db-ja.com

ObservableObjectでUIViewRepresentableを更新する方法

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配列をビューにバインドして、更新するたびに新しいポイントが実際に追加されるようにする方法を教えてください。

9
Vive

このソリューションは私にとってはうまくいきましたが、EnvironmentObject https://Gist.github.com/svanimpe/152e6539cd371a9ae0cfee42b374d7c4

0