为什么在SwiftUI中,使用.sheet呈现模式视图时,会两次调用init()

时间:2020-02-20 08:10:22

标签: ios swift iphone swiftui

我正在使用以下代码在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调用模态时,都会创建模态视图的两个实例。

有人可以解释这种现象吗?

4 个答案:

答案 0 :(得分:3)

我在代码中对此进行了跟踪,发现视图中包含以下行:

@Environment(\.presentationMode) var presentation

由于https://stackoverflow.com/a/61311279/155186,我一直在这样做,但是由于某种原因,问题似乎对我来说已经消失了,所以我想我不再需要它了。

我已向Apple提交了反馈FB7723767。

答案 1 :(得分:1)

从Xcode 11.4.1(11E503a)开始,这可能是一个错误。 请注意,例如,如果初始化视图模型(或其他与此相关的事物),则如下所示:

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

虚拟机将初始化两次。

答案 2 :(得分:0)

注释掉/从Modal中删除init()方法,其他都一样。您应该能够解决正在创建Modal的两个实例的问题,这是因为您正在Modal的init()中显式初始化绑定(showingModal)。希望这有道理。

答案 3 :(得分:0)

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