不允许从视图更新中发布 SwiftUi 更改



使用此代码时,我收到很多"不允许从视图更新中发布更改",这会导致冻结/崩溃。

该错误几乎永久显示我是否在地图上移动,所以我对为什么会这样有点困惑。

请问关于可能导致这种情况的原因的任何想法?

谢谢

import SwiftUI
import MapKit
struct MapView: View {

@State private var region = MKCoordinateRegion()

var stations:[StationPrix]
@Binding var isFullScreen: Bool
@Environment(.scenePhase) var scenePhase
@Binding var selected:Int

@State var tracking:MapUserTrackingMode = .follow

var body: some View {
Map(coordinateRegion: $region, interactionModes: .all, showsUserLocation: true, userTrackingMode: .constant(tracking), annotationItems: stations) { station in

MapAnnotation(coordinate: station.coordinate) {

VStack(spacing: 0) {
Image(station.imageName)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: station.imageName == "Station Service" ? 0 : 30 , height: station.imageName == "Station Service" ? 0 : 30)
.padding(.top, 5)

VStack(spacing: 0) {
ForEach (station.prix,id: .id) { prix in

VStack(spacing: -3){

HStack{
Text("(prix.nom)")
.font(.system(size: 7, weight: .light, design: .default))
Spacer()
}
.foregroundColor(Color.black)

HStack{
Text("(prix.valeur?.toCurrencyFormat() ?? "nul")")
.padding(.leading, 4)
.font(.system(size: 12, weight: prix.isCheapest == true ? .regular: .light, design: .default))

.foregroundColor(prix.isCheapest == true ? Color.green : Color.black)
}
}
}

}.padding(3)
}
.background(Color.white)
.cornerRadius(10)
.overlay(
RoundedRectangle(cornerRadius: 10)
.stroke(Color.black, lineWidth: 0.5).opacity(0.6)
)
}
}

.onAppear{

DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) {

tracking = .none

region.span = MKCoordinateSpan(
latitudeDelta: 0.0925,
longitudeDelta: 0.0925
)
}
}
}
}

struct FullScreenMap: View {
@Binding var isFullScreen:Bool
@Binding var selected:Int
var stations:[StationPrix]
@Environment(.dismiss) var dismiss

var body: some View {
ZStack {
MapView(stations: stations, isFullScreen: $isFullScreen, selected: $selected )
.edgesIgnoringSafeArea(.all)
.accentColor(Color(.systemPink))
VStack(alignment:.trailing) {
Spacer()
HStack {

Button(action: {

print ("Tapped")

self.selected = 2
self.dismiss()

}) {
HStack {
Image(systemName: "xmark")
.foregroundColor(.white)
}
.padding()
.background(Color.blue)
.mask(Circle())
}.frame(width: 60, height: 60)

}
}
}
}
}

好吧,.constant(tracking)是一个问题,.constant应该只在预览中使用。此外,您在onAppear中使用调度异步也是一个问题,因为如果视图消失并且状态在截止日期之前被销毁怎么办?您可以通过使用在这种情况下自动取消的.task并使用任务睡眠重新创建调度异步来改善这一点。

但是,MapuserTrackingMode中也有一个已知的错误,我在 FB9990674 下报告了这个错误,你可以在这里阅读更多关于它的信息:

SwiftUI 映射导致"在视图更新期间修改状态">

最新更新