iOS16中NavigationLink弃用:SwiftUI代码迁移求助
核心适配逻辑
iOS16起,NavigationLink.init(destination:isActive:label:)被弃用,官方推荐使用NavigationStack + navigationDestination组合,通过定义路由标识来管理页面跳转,替代原有的isActive绑定方式。
分步重构代码
1. 定义导航路由枚举
先创建一个遵循Hashable的枚举,用来标识不同的跳转目标,支持传递页面参数:
// 根据业务需求定义路由,可添加关联值传递参数 enum RegistrationRoute: Hashable { case nextStep case infoFill(String) // 示例:传递字符串参数 }
2. 重构RegistrationView
替换原有的NavigationView为NavigationStack,绑定路由状态变量,并用带value的NavigationLink配合navigationDestination实现跳转:
struct RegistrationView: View { // 绑定当前选中的路由,nil表示无跳转 @State private var currentRoute: RegistrationRoute? var body: some View { NavigationStack(path: $currentRoute) { VStack { // 方式1:用Button触发跳转(灵活控制时机) Button("进入下一步") { currentRoute = .nextStep } // 方式2:保留NavigationLink样式 NavigationLink(value: RegistrationRoute.infoFill("用户ID_123")) { Text("完善信息") } } // 匹配路由,渲染对应目标页面 .navigationDestination(for: RegistrationRoute.self) { route in switch route { case .nextStep: NextStepView() // 原destination对应的页面 case .infoFill(let userId): InfoFillView(userId: userId) // 接收参数的页面 } } } } }
常见报错解决
- "No navigation destination found for ...":确保
navigationDestination的类型和NavigationLink的value类型完全一致,且navigationDestination必须放在NavigationStack内部 - 参数传递报错:通过枚举的关联值传递参数,在
navigationDestination的闭包中取出使用,避免直接传递View实例 - 混合NavigationView报错:iOS16+需完全替换旧的
NavigationView为NavigationStack,不要混用两者
内容的提问来源于stack exchange,提问作者robowarrior
相关产品推荐
相关产品推荐

