You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:25:30