次のコードで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つのインスタンスが作成されます。
誰かがこの現象を説明できますか?
これをコードで追跡して、ビューに次の行があることを確認しました。
@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は2回初期化されます。
他のすべてを同じにして、Modalからinit()メソッドをコメントアウト/削除します。作成されるModalの2つのインスタンスの問題を解決できるはずです。これは、Modalのinit()でバインディング(showingModal)を明示的に初期化しているためです。これが理にかなっているといいのですが。