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