画面を閉じる為に使う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)の使い方を解説します。 完全な全画面表示ではなく、元の画面の上にカードをのせたようなイメージで、遷移元の画面が少し見えるのがシートの特徴です。 画面全体を覆うモ...