SwiftUI视图返回异常:关闭第三视图却回到首视图而非第二视图
问题:从第三视图返回时意外跳回第一视图而非第二视图
我的应用包含三个视图,点击每个视图上的按钮可打开新视图。点击第三视图的按钮时,我期望关闭第三视图并显示第二视图,但实际应用却直接跳回到了第一视图。
注:我已将应用代码精简为最小可复现代码,仍能重现该问题。
// *** 主应用*** @main struct sample_sampleApp: App { var body: some SwiftUI.Scene { WindowGroup { NavigationView { ContentView().ignoresSafeArea() }.navigationViewStyle(.stack) } } } // *** 首页(第一视图)*** import SwiftUI struct ContentView: View { @State private var goToView2 = false var body: some SwiftUI.View { VStack { NavigationLink(destination: View2(), isActive: $goToView2) { Button(action: { goToView2.toggle() }) { Text("这是第一视图 - 点击前往第二视图").foregroundColor(.red).font(.title) } } } } } // *** 第二视图*** import SwiftUI import Combine struct View2: View { @ObservedObject var viewModel: View2ViewModel = View2ViewModel() var body: some SwiftUI.View { VStack { switch viewModel.state { case .showView2: VStack(alignment: .leading, spacing: 8) { Button(action: { viewModel.navigateToView3() } ) { Text("这是第二视图 - 点击前往第三视图").foregroundColor(.blue).font(.title) } } case .showView3: View3() } } .onAppear() { viewModel.isViewVisible = true viewModel.doSomething() } .onDisappear() { viewModel.isViewVisible = false } } } // *** 第二视图的ViewModel*** class View2ViewModel: ObservableObject { enum View2AppState { case showView2 case showView3 } // 状态更新时触发UI变化 @Published var state: View2AppState = .showView2 var isViewVisible = false func doSomething() { self.state = .showView2 } func navigateToView3() { self.state = .showView3 } } // *** 第三视图*** struct View3: View { @ObservedObject var viewModel: View3ViewModel = View3ViewModel() @Environment(\.dismiss) var dismiss var body: some SwiftUI.View { VStack { switch viewModel.state { case .showView3: VStack(alignment: .leading, spacing: 8) { Button(action: { dismiss() } ) { Text("这是第三视图 - 点击关闭并返回第二视图").foregroundColor(.green).font(.title) } } } } .onAppear() { viewModel.isViewVisible = true viewModel.doSomething() } .onDisappear() { viewModel.isViewVisible = false }.navigationBarBackButtonHidden(true) } } // *** 第三视图的ViewModel*** class View3ViewModel: ObservableObject { enum View3AppState { case showView3 } // 状态更新时触发UI变化 @Published var state: View3AppState = .showView3 var isViewVisible = false func doSomething() { self.state = .showView3 } }
我不确定哪里出错了。之前使用dismiss()关闭sheet时一切正常,但在这种导航场景下却失效了。我在iOS 16.0上运行此代码,应用最低支持版本设置为iOS 15。
编辑:我也在iOS 15.0上测试过,同样能重现该问题,所以肯定是我的代码存在问题,但我找不到问题所在。我使用了NavigationView并将导航视图样式设置为.stack。
内容的提问来源于stack exchange,提问作者tech_human
相关产品推荐
相关产品推荐

