swift - SwiftUI @State 的 UIKit 更新导致“在视图更新期间修改状态”
问题描述
我有一个加载 MapKit 的 SwiftUI 组件,如下所示:
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 的渲染中更改 state 属性,并且这种突变应该发生在身体之外,但是我需要身体内部的 MapView 怎么办?
XCode 版本 11.3.1 (11C504)
macOS 版本 10.15.4 测试版 (19E224g)
解决方案
通常的解决方法是等待修改,如下所示
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
DispatchQueue.main.async {
self.control.showingPlaceDetails = true
}
}
推荐阅读
- sql - 如何查找自某个日期以来不同记录的计数(例如:2018 年至今)?
- python - Python中的字典生成器
- excel - 导入文本文件内容和文本文件名称,然后使用宏分隔到 Excel
- c# - 强名称签名对此程序集 XAMLMarkupExtensions.dll 无效
- c# - 如何在泛型方法中获取具体类型
- html - 怎么做:窗外的图片
- c# - 如何使“Shift + Enter”在文本框中生成新行?
- mysql - Docker Compose Mysql 初始化文件错误(Windows、Dockertoolbox)
- android - 带有可编辑部分的 TextView
- python - CherryPy 如何在获取表单中指定多个“动作”?