web-dev-qa-db-ja.com

なぜそれがSwiftUIであるのか、.sheetでモーダルビューを提示すると、init()が2回呼び出される

次のコードで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で呼び出すたびに、モーダルビューの2つのインスタンスが作成されます。

誰かがこの現象を説明できますか?

6
Alvar

これをコードで追跡して、ビューに次の行があることを確認しました。

@Environment(\.presentationMode) var presentation

私は https://stackoverflow.com/a/61311279/155186 のためにそれを行っていましたが、何らかの理由で問題が解消されたように思われるので、もう必要ないようです。

私はAppleこれについてフィードバックFB7723767を提出しました。

1
Jeremy

Xcode 11.4.1(11E503a)の時点で、これはおそらくバグです。たとえば、次のようにビューモデル(またはそのほかのこと)を初期化する場合は注意してください。

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

VMは2回初期化されます。

0
Adrian

他のすべてを同じにして、Modalからinit()メソッドをコメントアウト/削除します。作成されるModalの2つのインスタンスの問題を解決できるはずです。これは、Modalのinit()でバインディング(showingModal)を明示的に初期化しているためです。これが理にかなっているといいのですが。

0
Gayal Sasinda