![](/img/trans.png)
[英]SwiftUI Button action - State var not retaining its assigned value
[英]Why is SwiftUI Map modifying the state of its calling struct, if no frame is assigned?
設置:
我的應用程序使用 SwiftUI Map
,本質上是
struct MapViewSWUI: View {
@Binding private var show_map_modal: Bool
@State private var region: MKCoordinateRegion
//…
init(show_map_modal: Binding<Bool>) {
self._show_map_modal = show_map_modal
self.region = // Some computed region
//…
var body: some View {
//…
Map(coordinateRegion: $region)
.frame(width: 400, height: 300) // Some frame for testing
}
}
使用此代碼,我可以毫無問題地以模態方式顯示地圖。
問題:
如果我注釋掉.frame
視圖修飾符,我會得到運行時錯誤
Modifying state during view update, this will cause undefined behavior.
題:
為什么在我的情況下需要為Map
設置frame
? 本教程會這樣做,但 Apple 的文檔不會。 怎么做才對?
附言:
我已經閱讀了類似問題的答案,並嘗試使用運行時斷點來捕獲錯誤,但它沒有顯示任何有趣的內容:
我找到了與同一錯誤相關的另一個問題的答案,但它不適用於此處。
編輯:
找到解決方法,但不理解:
我的地圖是從另一個視圖模態呈現的。 這個視圖有一個state var
來控制演示:
@State private var show_map_modal = false
視圖的主體由一個HStack
和一些視圖組成,一個fullScreenCover
視圖修飾符應用於HStack
:
var body: some View {
HStack {
// …
}
.fullScreenCover(isPresented: $show_map_modal) {
MapViewSWUI(show_map_modal: $show_map_modal, itemToBeDisplayed: viewItem)
.ignoresSafeArea(edges: [.leading, .trailing])
}
}
如果地圖以這種方式呈現,則不會引發運行時錯誤。
但是,如果我在邊緣集中包含(就像到目前為止所做的那樣) .bottom
.top
則會引發運行時錯誤Modifying state during view update
。
如果有任何提示,我會很高興。
我的猜測是錯誤根本與框架無關,而是與顯示工作表后區域的更新有關。
正如您在我的代碼中看到的那樣,我在呈現 seet 后 3 秒更新了區域。 然后,錯誤出現了。
這會發生在您的代碼中嗎?
struct ContentView: View {
@State private var show_map_modal = false
var body: some View {
Button {
show_map_modal.toggle()
} label: {
Text("Show me the map!")
}
.sheet(isPresented: $show_map_modal) {
MapViewSWUI(show_map_modal: $show_map_modal)
}
}
}
struct MapViewSWUI: View {
@Binding private var show_map_modal: Bool
@State private var region: MKCoordinateRegion
init(show_map_modal: Binding<Bool>) {
self._show_map_modal = show_map_modal
self.region = MKCoordinateRegion(
center: CLLocationCoordinate2D(
latitude: 51.507222,
longitude: -0.1275),
span: MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5)
)
}
var body: some View {
VStack(alignment: .trailing) {
Button("Done") {
show_map_modal.toggle()
}
.padding(10)
Map(coordinateRegion: $region)
}
// .frame(width: 400, height: 300) // Some frame for testing
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
self.region = MKCoordinateRegion(
center: CLLocationCoordinate2D(
latitude: 31.507222,
longitude: -1.1275),
span: MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5)
)
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.