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
相关产品推荐
相关产品推荐

