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

Joh*_*hnH 21 xcode mvvm swiftui

我读过许多关于此错误的问题,这些问题与取消工作表有关,但没有一个涉及 SwiftUI 的地图。以下代码会生成此错误。视图模型中没有任何内容被更新。我只是将一个区域的绑定传递到 Map 初始值设定项中。对区域使用本地状态变量不会出现错误。我正在运行 Xcode 14.0。如果我删除 @Published 属性包装器,则错误就会消失。因此,我对视图模型应如何通知视图该区域已更改(可能是由于位置更新)感到困惑。

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)
    }
}

Run Code Online (Sandbox Code Playgroud)

小智 0

@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))
    }
}
Run Code Online (Sandbox Code Playgroud)

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