簡體   English   中英

為什么在 SwiftUI 中,當用 .sheet 呈現模態視圖時,init() 被調用兩次

[英]Why is it in SwiftUI, when presenting modal view with .sheet, init() is called twice

我正在使用以下代碼在 WatchOS 上生成情況

struct Modal : View {
    @Binding var showingModal : Bool
    
    init(showingModal : Binding<Bool>){
        self._showingModal = showingModal
        print("init modal")
    }
    
    var body: some View {
        Button(action: {
            self.showingModal.toggle()
        }, label: {
            Text("TTTT")
        })
    }
}

struct ContentView: View {
    @State var showingModal = false
    var body: some View {
        Button(action: {
            self.showingModal.toggle()
        }, label: {
            Text("AAAA")
        }).sheet(isPresented: $showingModal, content: {Modal(showingModal: self.$showingModal)})
    }
}

每次我按下主視圖中的按鈕以使用 .sheet 調用模態時,都會創建模態視圖的兩個實例。

有人可以解釋這種現象嗎?

我在我的代碼中跟蹤到在我的視圖中有以下行:

@Environment(\.presentationMode) var presentation

由於https://stackoverflow.com/a/61311279/155186 ,我一直在這樣做,但由於某種原因,這個問題似乎對我來說已經消失了,所以我想我不再需要它了。

我已就此向 Apple 提交了反饋 FB7723767。

從 Xcode 11.4.1 (11E503a) 開始,這可能是一個錯誤。 請注意,例如,如果像這樣初始化視圖模型(或其他任何事情):

.sheet(isPresented: $isEditingModalPresented) {
    LEditView(vm: LEditViewModel(), isPresented: self.$isEditingModalPresented)
}

VM 將被初始化兩次。

從 Modal 注釋掉/刪除 init() 方法,其他所有內容都相同。 您應該能夠解決創建兩個 Modal 實例的問題,這是因為您在 Modal 的 init() 中顯式初始化了綁定(showingModal)。 希望這是有道理的。

private let uniqueId: String = "uniqueId" 

Button(action: {
    self.showingModal.toggle()
}, label: {
    Text("AAAA")
})
    .sheet(isPresented: $showingModal) {
        Modal(showingModal: self.$showingModal)
          .id("some-unique-id")
    }

前任:

.id(self.uniqueId)

將唯一 ID 添加到您的 .sheet 中,不用擔心:)

But, do not use UUID(), because sheet view will be represented on every touch event

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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