xcode SwiftUI:不允许从视图更新中发布更改,这将导致未定义的行为(使用`ViewModel`方法时)

bq9c1y66  于 12个月前  发布在  Swift
关注(0)|答案(1)|浏览(151)

我已经读了一些关于这个错误的问题,涉及到解雇表,但是没有处理SwiftUI的Map。下面的代码生成了这个错误。视图模型中没有更新任何东西。我只是将绑定到一个区域的绑定传递到Map初始化器中。对区域使用本地状态变量没有错误。我运行的是Xcode 14.0。如果我删除@所以我对于视图模型应该如何通知视图区域已经改变感到困惑,也许是由于位置更新。

import SwiftUI
import MapKit

class MM : ObservableObject {
    @Published var region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 51.507222, longitude: -0.1275), span: MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5))
}

struct SimpleMap: View {
    @ObservedObject var mm = MM()
    @State private var region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 51.507222, longitude: -0.1275), span: MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5))

    var body: some View {
        //Error
        Map(coordinateRegion: $mm.region)
        
        //No Error
        //Map(coordinateRegion: $region)
    }
}

字符串

qaxu7uf2

qaxu7uf21#

您需要将@MainActor属性添加到ViewModel,并将@ObervedObject替换为@StateObject
下面是一个如何实现它的例子:

import SwiftUI
import MapKit

struct SimpleMap: View {
    @StateObject var vm = VM()

    var body: some View {
        Map(coordinateRegion: $vm.region)
    }
}

extension SimpleMap {
    @MainActor class VM: ObservableObject {
        @Published var region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 51.507222, longitude: -0.1275), span: MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5))
    }
}

字符串
这里最重要的是@MainActor属性。

相关问题