【问题标题】:SwiftUI Map() view error: Publishing changes from within view updates is not allowed, this will cause undefined behaviorSwiftUI Map() 视图错误:不允许从视图更新中发布更改,这将导致未定义的行为
【发布时间】:2023-02-01 20:47:24
【问题描述】:

我正在尝试构建一个小型地图应用程序,用户的位置一直在变化。总的来说,我一直都在获取经纬度更新。我需要显示它们并用滑动动画显示变化,类似于 Apple FindMyFriend,当它们在实时移动时滑过地图。

这是我的观点:

struct ContentView: View {
@StateObject var request = Calls()

@State private var mapRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 56.946285, longitude: 24.105078), span: MKCoordinateSpan(latitudeDelta: 0.02, longitudeDelta: 0.02))

var body: some View {
    Map(coordinateRegion: $mapRegion, annotationItems: $request.users){ $user in
        withAnimation(.linear(duration: 2.0)) {
            MapAnnotation(coordinate: CLLocationCoordinate2D(latitude: user.latitude, longitude: user.longitude)){
                Circle()
            }
        }
    }
}

}

在视图模型中调用函数,改变用户位置,响应只是来自 API 的传入字符串:

    func collectUsers(_ response: String){
    if users.count != 0{
        var data = response.components(separatedBy: "\n")
        data.removeLast()
    
        let updates = self.users.map{ user -> User in
            let newData = updateUserLocation(user: user, input: data)
            return User(id: user.id, name: user.name, image: user.image, latitude: Double(newData[1])!, longitude: Double(newData[2])!)
        }
        DispatchQueue.main.async {
            self.users = updates
        }
    }else{
        var userData = response.components(separatedBy: ";")
        userData.removeLast()
        
        let users = userData.compactMap { userString -> User? in
            let userProperties = userString.components(separatedBy: ",")
            
            var idPart = userProperties[0].components(separatedBy: " ")
            if idPart.count == 2{
                idPart.removeFirst()
            }
            
            guard userProperties.count == 5 else { return nil }
            guard let id = Int(idPart[0]),
                  let latitude = Double(userProperties[3]),
                  let longitude = Double(userProperties[4]) else { return nil }
            
            return User(id: id, name: userProperties[1], image: userProperties[2], latitude: latitude, longitude: longitude)
        }
        DispatchQueue.main.async {
            self.users = users
        }
    }
}

当然还有我的@Published:

class Calls: ObservableObject{
@Published var users = [User]()

当我使用 MapMarker 而不是 MapAnnotation 时,错误并不明显。我会使用标记,但我需要地图中的每个用户视图都不同。

【问题讨论】:

    标签: swiftui mapkit


    【解决方案1】:

    如果有人遇到同样的问题。我花了一整天的时间来解决这个问题,但问题是在 Xcode 14 中这是一个错误。在我安装 Xcode 13.4.1 后,错误消息消失了。

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 2022-12-03
      • 2022-10-04
      • 2022-10-02
      • 2021-09-17
      • 2023-02-06
      • 2022-09-28
      • 2021-12-18
      • 2022-11-13
      相关资源
      最近更新 更多