SwiftUIでModalをコードで閉じる方法

SwiftUIで表示したModalをボタンをタップしたイベントなどからコードで閉じる方法を説明します。

struct ContentView : View {
   @State var isDetailPresented: Bool = false
   
   var body: some View {
       Button(action: {
           self.isDetailPresented.toggle()
       }) {
           Text("Show detail")
               .presentation(
                   isDetailPresented ? Modal(DetailView().environment(\.isPresented, $isDetailPresented)) : nil
           )
       }
   }
}

struct DetailView: View {
   @Environment(\.isPresented) var isPresented
   
   var body: some View {
       Button(action: {
           self.isPresented?.value.toggle()
       }) {
           Text("Dismiss")
       }
   }
}

UIとしては、ContentViewにあるShow DetailボタンをタップしたらDetailViewをModalで表示します。DetailViewのDismissボタンをタップするとModalが閉じます。

ContentViewにisDetailPresentedという状態を持たせます。isDetailPresentedがtrueの時にModalを作成してpresentationメソッドで表示しています。その時environmentメソッドで、DetailViewで@Environmentとして宣言したisPresentedに$isDetailPresentedを代入しています。$isDetailPresentedとはBinding<Bool>です。

DetailViewではDismissボタンをタップするとisPresentedをfalseに変更します。そうするとContentViewのisDetailPresentedがfalseになるのでpresentationにnilが渡されて、Modalが閉じます。

この記事が気に入ったらサポートをしてみませんか?