SwiftUI Onappear 在视图更新期间修改状态,这将导致未定义的行为

时间:2021-07-06 13:32:05

标签: ios swift swiftui

我正在 SwiftUI 中渲染 Map,在出现时更新来自 api 响应的注释,并且我在视图更新期间获得 Modifying 状态,这将导致未定义的行为。

下面是代码

class ViewModel: ObservableObject {
     @Published var results = [Destination]()
     func getData() {
         // APi call
         self.results = response
     } 
}

struct SampleView: View {

    @ObservedObject var viewModel = ViewModel()
    var body: some View {
    if #available(iOS 14.0, *) {
        VStack(spacing: -5) {
            Map(coordinateRegion: $region, showsUserLocation: true, annotationItems: viewModel.categorySearchResults) { dest in
                MapMarker(coordinate: dest.coordinate)
            }
        }.background(Color.clear)
        .onAppear(perform: {
            DispatchQueue.main.async {
                setRegion(viewModel.getLatLong()!)
                viewModel.getData()
            }
        })
    } else {
    }
}

private func setRegion(_ coordinate: CLLocationCoordinate2D) {
    region = MKCoordinateRegion(
        center: coordinate,
        span: MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2)
    )
}

}

1 个答案:

答案 0 :(得分:-1)

我看到这个问题是因为地图正在更新 State 变量区域以及结果的 @Published 属性,所以它触发了警告。

用 .constant(region) 替换 $region 只需使用以下代码即可解决问题

但是如果你更新区域值,它不会更新地图 或者您可以将 viewModel.categorySearchResults 作为上一个屏幕的依赖项发送,这样您就不需要在 onAppear 方法中调用 viewModel.getData()

  Map(coordinateRegion: .constant(region), showsUserLocation: true, annotationItems: viewModel.categorySearchResults) { dest in
                    MapMarker(coordinate: dest.coordinate)
                }