使用此代码时,我收到很多"不允许从视图更新中发布更改",这会导致冻结/崩溃。
该错误几乎永久显示我是否在地图上移动,所以我对为什么会这样有点困惑。
请问关于可能导致这种情况的原因的任何想法?
谢谢
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
并使用任务睡眠重新创建调度异步来改善这一点。
但是,Map
的userTrackingMode
中也有一个已知的错误,我在 FB9990674 下报告了这个错误,你可以在这里阅读更多关于它的信息:
SwiftUI 映射导致"在视图更新期间修改状态">