簡體   English   中英

如果沒有分配框架,為什么 SwiftUI Map 會修改其調用結構的狀態?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM