如何通过Button的action实现点击跳转至第二个页面
你可以通过状态变量驱动导航链路激活的方式,实现自定义Button点击触发跳转的效果,和直接使用NavigationLink的跳转逻辑完全一致,同时支持在跳转前插入自定义业务逻辑。
方案1:兼容iOS 13+ 通用写法(NavigationView)
通过@State声明布尔类型的跳转控制标记,将标记绑定到NavigationLink的isActive参数,把NavigationLink设为隐藏,在Button的action闭包里修改标记值即可触发跳转:
struct FirstPage: View { // 跳转控制状态 @State private var isPushToSecond = false var body: some View { NavigationView { VStack { Button("点击跳转第二页") { // 这里可以加跳转前的自定义逻辑:校验、埋点、参数处理等 isPushToSecond = true } // 绑定状态的隐藏导航链接 NavigationLink( destination: SecondPage(), isActive: $isPushToSecond ) { EmptyView() } .hidden() } .navigationTitle("首页") } } } struct SecondPage: View { var body: some View { Text("这是第二个页面") .navigationTitle("第二页") } }
方案2:iOS 16+ 新API写法(NavigationStack)
如果项目最低支持iOS 16及以上系统,可以直接用NavigationStack搭配navigationDestination修饰符,不需要额外写隐藏的NavigationLink,写法更简洁:
struct FirstPage: View { @State private var isPushToSecond = false var body: some View { NavigationStack { Button("点击跳转第二页") { // 跳转前自定义逻辑 isPushToSecond = true } .navigationTitle("首页") .navigationDestination(isPresented: $isPushToSecond) { SecondPage() } } } } struct SecondPage: View { var body: some View { Text("这是第二个页面") .navigationTitle("第二页") } }
补充说明
- 如果需要传值跳转,可以把布尔类型的控制状态替换为对应业务数据类型的可选值,当可选值被赋值为非nil时会自动触发跳转,页面销毁后状态会自动置为nil,不需要手动重置。
- 这种写法的跳转效果和直接点击NavigationLink完全一致,支持系统自带的返回手势、导航栏返回按钮,没有自定义转场的兼容问题。
内容的提问来源于stack exchange,提问作者leosoft
相关产品推荐
相关产品推荐

