我有一个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)
答案 0 :(得分:2)
对此的通常解决方法是待修改,如下所示
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
DispatchQueue.main.async {
self.control.showingPlaceDetails = true
}
}