Swift中NavigationLink重复跳转及废弃API替代方案咨询
问题2:废弃NavigationLink(isActive:)的替代方案
SwiftUI 4+官方推荐两种现代替代方式:
NavigationPath路径管理:适合复杂导航栈,通过状态对象记录跳转路径,灵活可控。NavigationLink(value:)+.navigationDestination(for:):适合简单跳转,通过值绑定触发导航。
以下是结合两种问题的完整修复代码:
import SwiftUI // 定义导航目标枚举,统一管理跳转类型 enum NavTarget { case thirdView } struct TestView: View { @State private var showActionSheet = false // 使用NavigationPath管理导航栈状态 @State private var navPath = NavigationPath() var body: some View { VStack { ForEach(["1", "2", "3"], id: \.self) { option in HStack { Text(option) Button(action: { showActionSheet = true }) { Image(systemName: "ellipsis") .padding() } } } } // 将sheet修饰符应用在容器上,避免重复创建 .sheet(isPresented: $showActionSheet) { actionSheetContent() } // 注册导航目标,关联枚举类型 .navigationDestination(for: NavTarget.self) { target in switch target { case .thirdView: ThirdView() } } } private func actionSheetContent() -> some View { Button(action: { // 先关闭sheet,再推入新视图 showActionSheet = false navPath.append(NavTarget.thirdView) }) { Text("Go to 3rd View") .frame(maxWidth: .infinity, maxHeight: .infinity) } .presentationDetents([.fraction(0.1)]) .padding() } } struct ThirdView: View { var body: some View { Text("ThirdView") } } #Preview { NavigationStack { TestView() } }
代码关键点说明
- 容器包裹
ForEach:确保.sheet和导航逻辑只被初始化一次,避免重复添加导航链接。 NavigationPath管理栈:通过navPath.append()触发跳转,栈状态清晰可控,不会出现重复推入的问题。- 枚举化导航目标:统一管理所有跳转类型,后续扩展新页面只需添加枚举值,代码更易维护。
内容的提问来源于stack exchange,提问作者user1385809
相关产品推荐
相关产品推荐

