Environmentで設定した変数が、ビューの関係性によって、同じ変数を参照できるときと、できない時がありました。
目次
Environment変数が共有されるケース
NavigationViewで遷移するビュー間では、Environmentで設定した同じ変数を参照することができます。
AppleもWWDCで、Environmentを導入するメリットの1つとして説明しているので、明らかですが念のため。
Environment変数が共有されないケース
@Environment変数は、.sheetで表示するビューには、自動では引き継げませんでした。
どうやら、バグという扱いらしいですが、今のところ直ってません。(2020.Apr.12現在)
ですので、sheetで表示するビューに対して、明示的に、.environemnt(….)として、渡す必要があります。
他のビューは?
これまで、ビューの遷移として、NavigationViewかSheetしか知らなかったのですが、TabViewがあることを見つけました。
TabViewではどうなのか調べてみました。
TabViewでは、Environment変数は共有されます
共有されないと困る代表格のManagedObjectContextで試しました。
途中のコメントされている.environmentコードの有無にかかわらず同じ値を参照することができました。
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 |
struct ContentView: View { @State private var selection = 0 @Environment(\.managedObjectContext) var moc var body: some View { TabView(selection: $selection){ RecordListView() // .environment(\.managedObjectContext, moc) .font(.title) .tabItem { VStack { Image("first") Text("First") } } .tag(0) Text("Hello, second!\(moc)") .font(.title) .tabItem { VStack { Image("second") Text("Second") } } .tag(1) } } } struct RecordListView: View { @Environment(\.managedObjectContext) var moc var body: some View { Text("Hello, RecordListView!\(moc)") } } |
まとめ:SwiftUIで.environmentを使って変数を共有できるビュー
- 共有できるビュー
-
- NavigationView
- TabView
- 共有できないビュー
-
- .sheet
Sponsor Link