画面を閉じる為に使うdismissとisPresentedについて解説します。
どちらも環境変数(EnvironmentValues)で定義されており、@Environmentプロパティラッパーで取得します。
iOS14以前で同様の機能を実現していたpresentationModeについては、こちらの記事を参照してください。

(アーカイブ)【SwiftUI】環境変数presentationModeについて
本記事で使用しているPresentationModeはiOS15以降では非推奨となっています。 最新の情報はこちらの記事を御覧ください。 環境変数presentationModeについて解説します。
環境
この記事の情報は次のバージョンで動作確認しています。
【Xcode】13.0
【Swift】5.5
【iOS】15.0
【macOS】Big Sur バージョン 11.6
【Swift】5.5
【iOS】15.0
【macOS】Big Sur バージョン 11.6
概要
環境変数dismissは、現在の画面を閉じるために使用するハンドラーを提供します。
isPresentedは、現在の画面が他の画面から呼びだされたのか否かをBool値で示します。
現在の画面が他から呼び出されたものでない場合にdismissを使っても効果はありません。
使用時の注意点
dismissとisPresentedはiOS15以降でのみ使用可能な環境変数です。
Xcode13.0で新規作成したプロジェクトはターゲットOSがiOS14.0の為、そのまま使用しようとすると次のようなエラーが出ます。
| 1 2 3 | 'dismiss' is only available in iOS 15.0 or newer | 
以下の画面でターゲットOSをiOS15以降に変更してください。

使用方法
環境変数 isPresented を参照し、他のViewから呼ばれていない(TopView)の場合は、次の画面へのリンクを表示。呼び出された画面では、dismissハンドラーを使って画面を閉じる処理を実装しています。
NavigationLinkで呼ばれた場合とSheetで呼ばれた場合のいずれも機能します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | struct ContentView: View {     /// 環境変数の取得     @Environment(\.isPresented) var isPresented     @Environment(\.dismiss) var dismiss     @State private var showingSheet = false     var body: some View {         if !isPresented {             /// 他の画面から呼ばれていない場合             VStack {                 NavigationView {                     VStack {                         Text("isPresented : False" )                         NavigationLink(destination: ContentView() ) {                             Text("NavigationLinkで画面を開く")                         }                         Button("Sheetで画面を開く") {                             self.showingSheet.toggle()                         }                         .sheet(isPresented: $showingSheet) {                             ContentView()                         }                     }                     .navigationTitle("Top View")                 }                             }         } else {             /// 他の画面から呼ばれている場合             Text("isPresenteed : True" )             Button("戻る") {                 dismiss()       // 現在の画面を閉じる             }         }     } } | 
あわせて読みたい記事

(アーカイブ)【SwiftUI】NavigationViewでの画面遷移
(2020/11/8 更新) 本記事で使用しているNavigationViewはiOS16以降では非推奨となっています。 最新の情報はこちらの記事を御覧ください。 NavigationView配下での画面遷移について解説します。

【SwiftUI】シートの使い方(sheet)
(2021/10/10 更新) Viewをモーダル表示にするシート(sheet)の使い方を解説します。 完全な全画面表示ではなく、元の画面の上にカードをのせたようなイメージで、遷移元の画面が少し見えるのがシートの特徴です。 画面全体を覆うモ...

 
  
  
  
  

