SwiftUI 地图导致 "modifying state during view update"
SwiftUI Map causes "modifying state during view update"
我想实现一个基本的地图视图,当用户点击按钮时,该视图将以用户位置为中心,类似于 Apple 地图应用程序。我尝试了以下操作,但每当我点击按钮时,控制台中都会打印 [SwiftUI] Modifying state during view update, this will cause undefined behavior.
。在我看来,更新 tracking
状态变量是导致错误的原因。但是,我不确定如何使用状态变量。尽管打印了错误,该应用程序确实按预期运行。有没有人对此有任何经验或知道可能出了什么问题?
struct ContentView: View {
@State var region: MKCoordinateRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 47.3769, longitude: 8.5417), latitudinalMeters: 2000, longitudinalMeters: 2000)
@State var tracking = MapUserTrackingMode.follow
var body: some View {
ZStack {
Map(coordinateRegion: $region, interactionModes: .all, showsUserLocation: true, userTrackingMode: $tracking)
.ignoresSafeArea()
.task {
let locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization();
}
Button {
tracking = .follow
} label: {
Image(systemName: tracking == .follow ? "location.fill" : "location")
.padding()
}
.background(.white)
}
}
}
在我看来这是 Map
中的一个错误(从 Xcode 版本 13.3.1 (13E500a) 和 iPhone 13 模拟器开始)。如果您切换到断点 side-bar 并单击 + 并添加一个所有运行时问题断点,如果您调试并单击该按钮,您将命中断点并看到:
此跟踪显示,当点击按钮以更改跟踪状态时,SwiftUI 通过调用 _setUserTrackingMode
(第 13 行)使用新状态更新 MKMapView
,但这样做的副作用是回调到 mapLayerDidChangeVisibleRegion
(第 9 行)并尝试设置绑定的值(第 6 行),很可能是 coordinateRegion
。它不应该在从状态更新 MKMapView 时设置绑定,这是导致警告的原因。我们都应该报告错误 - 我在开发人员工具 - SwiftUI 下将其提交为 FB9990674,请随时参考我的号码。
我想实现一个基本的地图视图,当用户点击按钮时,该视图将以用户位置为中心,类似于 Apple 地图应用程序。我尝试了以下操作,但每当我点击按钮时,控制台中都会打印 [SwiftUI] Modifying state during view update, this will cause undefined behavior.
。在我看来,更新 tracking
状态变量是导致错误的原因。但是,我不确定如何使用状态变量。尽管打印了错误,该应用程序确实按预期运行。有没有人对此有任何经验或知道可能出了什么问题?
struct ContentView: View {
@State var region: MKCoordinateRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 47.3769, longitude: 8.5417), latitudinalMeters: 2000, longitudinalMeters: 2000)
@State var tracking = MapUserTrackingMode.follow
var body: some View {
ZStack {
Map(coordinateRegion: $region, interactionModes: .all, showsUserLocation: true, userTrackingMode: $tracking)
.ignoresSafeArea()
.task {
let locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization();
}
Button {
tracking = .follow
} label: {
Image(systemName: tracking == .follow ? "location.fill" : "location")
.padding()
}
.background(.white)
}
}
}
在我看来这是 Map
中的一个错误(从 Xcode 版本 13.3.1 (13E500a) 和 iPhone 13 模拟器开始)。如果您切换到断点 side-bar 并单击 + 并添加一个所有运行时问题断点,如果您调试并单击该按钮,您将命中断点并看到:
此跟踪显示,当点击按钮以更改跟踪状态时,SwiftUI 通过调用 _setUserTrackingMode
(第 13 行)使用新状态更新 MKMapView
,但这样做的副作用是回调到 mapLayerDidChangeVisibleRegion
(第 9 行)并尝试设置绑定的值(第 6 行),很可能是 coordinateRegion
。它不应该在从状态更新 MKMapView 时设置绑定,这是导致警告的原因。我们都应该报告错误 - 我在开发人员工具 - SwiftUI 下将其提交为 FB9990674,请随时参考我的号码。