SwiftUI如何在Alert选择Yes后导航至其他页面?
SwiftUI实现Alert确认后导航到其他页面
SwiftUI完全支持这个需求,核心是通过状态变量中转Alert的确认动作和导航触发逻辑,以下是针对不同iOS版本的可行实现方案:
iOS 16+ 推荐写法(NavigationStack)
使用navigationDestination配合状态变量,这是当前SwiftUI导航的标准实现方式:
import SwiftUI struct ContentView: View { @State private var showAlert = false @State private var shouldNavigate = false var body: some View { NavigationStack { Button("跳转前确认") { showAlert = true } .alert("确认跳转?", isPresented: $showAlert) { Button("No", role: .cancel) {} Button("Yes") { shouldNavigate = true } } .navigationDestination(isPresented: $shouldNavigate) { TargetView() } .navigationTitle("主页") } } } struct TargetView: View { var body: some View { Text("目标页面") .navigationTitle("详情页") } }
iOS 15及以下兼容写法(NavigationView)
如果需要适配旧版本系统,可使用NavigationLink的isActive绑定状态:
import SwiftUI struct ContentView: View { @State private var showAlert = false @State private var shouldNavigate = false var body: some View { NavigationView { Button("跳转前确认") { showAlert = true } // 隐藏的NavigationLink,通过状态控制导航 NavigationLink(destination: TargetView(), isActive: $shouldNavigate) { EmptyView() } .alert("确认跳转?", isPresented: $showAlert) { Button("No", role: .cancel) {} Button("Yes") { shouldNavigate = true } } .navigationTitle("主页") } } } struct TargetView: View { var body: some View { Text("目标页面") .navigationTitle("详情页") } }
关键逻辑说明
- 通过
showAlert状态控制弹窗显示,点击按钮触发弹窗 - 弹窗的"Yes"按钮修改
shouldNavigate状态,触发导航逻辑 - 避免直接在Alert按钮中调用导航方法,必须通过状态变量中转,这是SwiftUI响应式框架的核心要求
内容的提问来源于stack exchange,提问作者David Fernandes
相关产品推荐
相关产品推荐

