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

iOS SwiftUI NavigationLink跳转后如何通过自定义按钮关闭视图

自定义关闭按钮返回实现方法

通过NavigationLink压入导航栈的页面,直接调用SwiftUI环境提供的dismiss方法即可返回上一级,不需要额外传值或者代理回调,修改步骤如下:

  • 在Login视图中添加对应的环境变量声明
  • 在自定义xmark按钮的action闭包中调用dismiss方法即可

修改后的Login视图代码(iOS 15+ 推荐写法)

struct Login: View {
    @AppStorage("userid") var userid: Int = 0
    // 引入环境提供的dismiss方法
    @Environment(\.dismiss) private var dismiss

    var body: some View{
        
        VStack{
            
            HStack{
                
                Spacer()
                
                Button(action: {
                    // 调用dismiss即可关闭当前视图返回上一级
                    dismiss()
                }) {
                    Image(systemName: "xmark")
                        .resizable()
                        .frame(width: 18, height: 18)
                        .foregroundColor(Color(UIColor(named: "IconColor")!))
                }
                .padding(.top, 12.0)
                .padding(.trailing, 16.0)
            }
                         
            Spacer()
            
        }
        // 隐藏默认返回按钮的逻辑放在视图内部更符合SwiftUI封装规范,原有写在NavigationLink destination上的写法也可正常生效
        .navigationBarBackButtonHidden(true)
        
    }
}

低版本兼容写法(支持iOS 13/14)

如果需要适配iOS15以下的系统版本,把dismiss相关的声明和调用替换成presentationMode的写法即可:

struct Login: View {
    @AppStorage("userid") var userid: Int = 0
    // 低版本用presentationMode环境值
    @Environment(\.presentationMode) private var presentationMode

    var body: some View{
        
        VStack{
            
            HStack{
                
                Spacer()
                
                Button(action: {
                    // 调用wrappedValue的dismiss方法返回
                    presentationMode.wrappedValue.dismiss()
                }) {
                    Image(systemName: "xmark")
                        .resizable()
                        .frame(width: 18, height: 18)
                        .foregroundColor(Color(UIColor(named: "IconColor")!))
                }
                .padding(.top, 12.0)
                .padding(.trailing, 16.0)
            }
                         
            Spacer()
            
        }
        .navigationBarBackButtonHidden(true)
        
    }
}

注:上述dismiss方法会自动识别当前视图的展示方式,不管是NavigationLink压入的导航栈页面,还是通过sheet/fullScreenCover模态弹出的页面,调用后都可以正常关闭,不需要做额外区分。

内容的提问来源于stack exchange,提问作者TheGreatCornholio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:57:38