ViewState 不会随 MapView 改变

问题描述

我目前正在尝试在工作表中显示 Mapview。奇怪的是,MapView 显示在画布中。但是在模拟器中它没有更新视图。有人可以向我解释一下,我做错了什么吗?

这是我的 MapViewModel

class MapViewModel: ObservableObject {
    
    enum ViewState {
        case failed
        case loading
        case value([Checkpoint])
    }
    
    @Published var viewState: ViewState = .loading
    @Published var region = MKCoordinateRegion()

    func initMap(name: String,address: String) {
        self.viewState = .loading
        getLocation(from: address) { coordinate in
            if let coordinate = coordinate {
                let checkpoint = Checkpoint(title: name,coordinate: coordinate)
                self.region = MKCoordinateRegion(center: coordinate,span: MKCoordinateSpan(latitudeDelta: 0.1,longitudeDelta: 0.1))
                
                var checkpoints: [Checkpoint] = []
                checkpoints.append(checkpoint)
                
                DispatchQueue.main.async {
                    withAnimation(.easeInOut) {
                        self.viewState = .value(checkpoints)
                        print("Done")
                    }
                }
            } else {
                DispatchQueue.main.async {
                    self.viewState = .failed
                }
            }
        }
    }
    
    func getLocation(from address: String,completion: @escaping (_ location: CLLocationCoordinate2D?)-> Void) {
        let geocoder = CLGeocoder()
        geocoder.geocodeAddressString(address) { (placemarks,error) in
            guard let placemarks = placemarks,let location = placemarks.first?.location?.coordinate else {
                completion(nil)
                return
            }
            completion(location)
        }
    }
}

这是我的视图

struct MapView: View {
    
    @ObservedObject var mapVM = MapViewModel()
    var name: String
    var address: String
    
    var body: some View {
        switch mapVM.viewState {
            case .loading:
                VStack(alignment: .center) {
                    ProgressView()
                }
                .onAppear() {
                    mapVM.initMap(name: name,address: address)
                }
            case .value(let checkpoints):
                VStack {
                    Map(coordinateRegion: $mapVM.region,annotationItems: checkpoints) { item in
                        MapAnnotation(coordinate: item.coordinate) {
                            VStack(spacing: 0) {
                                Image(systemName: "mappin.circle.fill")
                                    .renderingMode(.original)
                                    .font(.title)
                                Text(name)
                                    .font(.caption)
                                    .shadow(color: Color.systemBackground.opacity(0.5),radius: 1)
                                    .frame(minWidth: 0,maxWidth: 150)
                            }
                        }
                    }
                }
            case .failed:
                Text("Failed")
            }
    }
    
}

这是我在 MainView 中实现 MapView 的方法

VStack(alignment: .center) {
    MapView(name: tickerDetails.name,address: tickerDetails.hqAddress)
       .frame(width: UIScreen.main.bounds.width - 30,height: 220)
       .border(Color.systemGray4,cornerRadius: 10)
       .padding(.leading)
}

最后但并非最不重要的是,这里有两个屏幕截图,它是如何在画布和模拟器中显示的:

enter image description here

预览数据来自本地存储的 JSON 文件。模拟器的数据是从互联网上获取的。但是数据加载正确,因为打印语句是在 MapViewModel 中执行的(并且坐标也是正确的)。它只是不使用数据更新视图。

编辑

我在“普通”视图中实现了 MapView,它在那里工作正常。似乎,所呈现的工作表无法与视图状态一起使用...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...