実現したいこと
SwiftUIのNavigationViewによる画面遷移で、
AView→BView→CView→DView→EView と遷移した時に、EViewからBViewまで戻りたいです。
Bindingを利用するとB-EView間のViewにも手を入れないといけないため、できればEnvironmentObjectなどでBViewとEViewのみで完結したいです。
https://www.yururiwork.net/archives/1138
上記記事を参考にしてEnvironmentObjectの参照をFirstViewからSecondViewに移動していますが、FinalViewのボタンを押してもSecondViewに戻りません。
(記事通りの実装であればFinalViewからFirstViewに戻ることは確認済みです)
下記ソースに問題があれば指摘いただきたいのと、バグ等でこの方法では実現できない場合、他にどのような遷移方法があるかご教授いただけますと幸いです。
下限iOSを15で検証しているため、NavigationStackは利用できません。
該当のソースコード
※下記class、struct単位で全てファイルは分かれています
SwiftUI
1class EnvironmentData: ObservableObject { 2 @Published var isNavigationActive: Binding<Bool> = Binding<Bool>.constant(false) 3} 4 5@main 6struct Test056_NavigationApp: App { 7 var body: some Scene { 8 WindowGroup { 9 FirstView().environmentObject(EnvironmentData()) 10 } 11 } 12} 13 14struct FirstView: View { 15 var body: some View { 16 NavigationView { 17 VStack { 18 NavigationLink(destination: SecondView()) { 19 Text("Forward to Second View.") 20 } 21 } 22 }.navigationBarTitle("First View") 23 } 24} 25 26// FinalViewから戻りたいView 27struct SecondView: View { 28 29 @State var isActive: Bool = false 30 @EnvironmentObject var envData: EnvironmentData 31 32 var body: some View { 33 VStack { 34 NavigationLink(destination: ThirdView(), isActive: $isActive) { 35 EmptyView() 36 } 37 Button("Forward to Third View.") { 38 isActive = true 39 envData.isNavigationActive = $isActive 40 } 41 42 }.navigationBarTitle("Second View") 43 } 44} 45 46struct ThirdView: View { 47 var body: some View { 48 VStack { 49 NavigationLink(destination: FinalView()) { 50 Text("Forward to Final View.") 51 } 52 }.navigationBarTitle("Third View") 53 } 54} 55 56struct FinalView: View { 57 58 @EnvironmentObject var envData: EnvironmentData 59 60 var body: some View { 61 VStack { 62 Button("pop to Second View") { 63 envData.isNavigationActive.wrappedValue = false 64 } 65 }.navigationBarTitle("Final View") 66 } 67}
試したこと
FirstViewからSecondViewへ遷移する際、Navigationlinkではなく
.fullScreenCover(isPresented: $isPresented, content: SecondView.init)
を使用して遷移することで無理やりSecondViewにNavigationViewを定義したところ
FinalViewからSecondViewに戻ることは確認できました。
ただしこの場合SecondViewからFirstViewに戻れなくなってしまうのでできれば使いたくない方法です。
補足情報(FW/ツールのバージョンなど)
XCode15.0
下限iOS15

0 コメント