SwiftKit @State的UIKit更新导致“在视图更新期间修改状态”

时间:2020-02-28 07:32:18

标签: swift uikit swiftui

我有一个SwiftUI组件,像这样加载MapKit:

struct AddressView: View {

    @State private var showingPlaceDetails = false

    var body: some View {
        MapView(showPlaceDetails: self.$showPlaceDetails)
    }
}

MapView组件是使用UIKit-> SwiftUI包装技术的MapKit结构:

struct MapView: UIViewRepresentable {

    @Binding var showingPlaceDetails: Bool

    func makeUIView(context: Context) -> MKMapView {

        let map = MKMapView()

        map.delegate = context.coordinator

        return map
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    final class Coordinator: NSObject, MKMapViewDelegate {

        var control: MapView

        init(_ control: MapView) {
            self.control = control
        }

        func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {

              // This is where the warning happen
              self.control.showingPlaceDetails = true
        }
    }
}

因此,更改 showPlaceDetails 会发出以下警告:[SwiftUI] Modifying state during view update, this will cause undefined behavior.

我应该如何清除此代码?此实现正确吗?

我了解我正在通过@Binding更改父@State属性,该属性将使用MapView重新呈现AddressView。

我理解为什么它不好,喜欢在React中更改渲染中的状态属性,并且这种突变应该发生在体外,但是当我需要在体内使用MapView时怎么办呢?

XCode版本11.3.1(11C504)

macOS版本10.15.4 Beta(19E224g)

1 个答案:

答案 0 :(得分:2)

对此的通常解决方法是待修改,如下所示

    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
          DispatchQueue.main.async {
             self.control.showingPlaceDetails = true
          }
    }