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

SwiftUI技术问题:关闭Sheet后跳转视图,返回时重新弹出Sheet?

实现Sheet关闭后跳转视图,返回时重新弹出Sheet的解决方案

核心需求

  • 点击Sheet内的按钮,关闭Sheet并跳转到指定视图
  • 用户从跳转后的视图返回时,Sheet自动重新弹出

解决方案

无需使用已废弃的NavigationLink API,我们可以通过NavigationStack配合状态变量来实现需求,以下是完整代码:

import SwiftUI

struct ContentView: View {
    @State private var isPresented = true
    @State private var selection: PresentationDetent = .medium
    @State private var navigationPath = NavigationPath()
    
    var body: some View {
        NavigationStack(path: $navigationPath) {
            VStack {
                Text("主视图")
                
                Spacer()
            }
            .sheet(isPresented: $isPresented) {
                VStack {
                    Text("Sheet 内容")
                        .presentationDetents([.medium, .large], selection: $selection)
                        .interactiveDismissDisabled(true)
                        .presentationDragIndicator(.hidden)
                    
                    Button("开始") {
                        // 先关闭Sheet
                        isPresented = false
                        // 跳转到目标视图
                        navigationPath.append("TargetView")
                    }
                    .padding()
                }
            }
            // 监听导航路径变化,返回时重新弹出Sheet
            .onChange(of: navigationPath) { newPath in
                if newPath.isEmpty {
                    isPresented = true
                }
            }
            .navigationDestination(for: String.self) { _ in
                TargetView()
            }
        }
    }
}

struct TargetView: View {
    var body: some View {
        VStack {
            Text("Hello World")
            Spacer()
        }
        .navigationTitle("目标视图")
        .navigationBarTitleDisplayMode(.inline)
    }
}

关键逻辑说明

  1. 导航路径管理:使用NavigationPath和NavigationStack控制页面跳转,替代旧的NavigationView与废弃的NavigationLink
  2. Sheet关闭与跳转联动:Sheet内按钮点击时,先将isPresented设为false关闭Sheet,再通过navigationPath.append()触发页面跳转
  3. 返回时重新弹出Sheet:通过.onChange(of: navigationPath)监听导航路径变化,当路径为空(用户返回主视图)时,将isPresented设为true重新弹出Sheet
  4. Sheet配置保留:保留原需求中的presentationDetents、interactiveDismissDisabled等配置,确保Sheet交互符合预期

内容的提问来源于stack exchange,提问作者Jason Rich Darmawan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:58:19