環境変数presentationModeについて解説します。
環境
この記事の情報は次のバージョンで動作確認しています。
【Xcode】12.2
【Swift】5.3.1
【iOS】14.2
【macOS】Catalina バージョン 10.15.7
【Swift】5.3.1
【iOS】14.2
【macOS】Catalina バージョン 10.15.7
概要
環境変数presentationModeは、現在のViewに紐づくPresentationMode構造体への参照値(Binding)を持ちます。
PresentationMode構造体は次の2つの機能を実現します。
- 現在のViewが他のViewから呼ばれているかどうかを示すフラグ。
- 現在のViewを閉じる処理。
使用方法
presentationModeの取得
@Environmentプロパティラッパーを使って、取得します。
1 2 3 |
@Environment(\.presentationMode) var presentationMode |
取得したpresentationModeから、PresentationMode構造体に直接アクセスするには、wrappedValueを使用します。
1 2 3 4 |
/// PresentationModeへのアクセス presentationMode.wrappedValue |
PresentationMode構造体の使い方
プロパティisPresentedで他のViewから呼ばれたているかどうか判定可能です。
1 2 3 4 |
/// 他のViewから呼ばれているか判定(Bool) presentationMode.wrappedValue.isPresented |
dismiss()ファンクションで、現在のViewを閉じます。
他のViewから呼ばれたViewでは無い場合は、何もおきません。
1 2 3 4 |
/// 現在のViewを閉じる presentationMode.wrappedValue.dismiss() |
使用例
環境変数presentationModeを参照し、他のViewから呼ばれていない(TopView)の場合は、自Viewを再度開く処理を実装。
呼び出されたViewでは、dismiss()ファンクションで画面を閉じる処理を実装します。
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 |
struct ContentView: View { @Environment(\.presentationMode) var presentationMode var body: some View { if !presentationMode.wrappedValue.isPresented { /// 他のViewから呼ばれていない場合 VStack { NavigationView { VStack { Text("presentationMode : False" ) NavigationLink(destination: ContentView() ) { Text("画面を開く") } } .navigationTitle("Top View") } } } else { /// 他のViewから呼ばれている場合 Text("presentationMode : True" ) Button(action: { self.presentationMode.wrappedValue.dismiss() }) { Text("戻る") } } } } |
あわせて読みたい記事
(アーカイブ)【SwiftUI】NavigationViewでの画面遷移
(2020/11/8 更新) 本記事で使用しているNavigationViewはiOS16以降では非推奨となっています。 最新の情報はこちらの記事を御覧ください。 NavigationView配下での画面遷移について解説します。
【SwiftUI】シートの使い方(sheet)
(2021/10/10 更新) Viewをモーダル表示にするシート(sheet)の使い方を解説します。 完全な全画面表示ではなく、元の画面の上にカードをのせたようなイメージで、遷移元の画面が少し見えるのがシートの特徴です。 画面全体を覆うモ...