使用NavigationStack触发导航目标匹配错误,问题出在哪?
错误现象
NavigationLink 正在展示类型为“TransactionRoute”的值,但从该链接位置无法找到匹配的导航目标,链接无法激活。
问题原因
你把navigationDestination修饰符应用在了NavigationStack的外部,而SwiftUI要求导航目标必须属于当前导航栈的内部上下文,这样导航栈才能识别并匹配对应的路由类型。
修正后的代码
import SwiftUI struct TransactionRoute: Identifiable { let id = UUID() let realm: TransactionRealm let transaction: String? } extension TransactionRoute: Equatable, Hashable { static func == (lhs: TransactionRoute, rhs: TransactionRoute) -> Bool { lhs.id == rhs.id } public func hash(into hasher: inout Hasher) { hasher.combine(id) } } enum TransactionRealm: Int { case basic case upcoming case recurring } struct ContentView: View { @State var navigationPath = NavigationPath() var body: some View { NavigationStack(path: $navigationPath) { VStack { Image(systemName: "globe") .imageScale(.large) .foregroundColor(.accentColor) .padding(.bottom, 24) .onTapGesture { navigationPath.append(TransactionRoute(realm: .basic, transaction: nil)) } Text("Hello, world!") .onTapGesture { navigationPath.append(TransactionRoute(realm: .upcoming, transaction: nil)) } } // 将navigationDestination移到NavigationStack内部 .navigationDestination(for: TransactionRoute.self) { route in switch route.realm { case .basic: Text("Basic") case .upcoming: Text("Upcoming") case .recurring: Text("Recurring") } } } } }
关键修改点
- 把
.navigationDestination(for: TransactionRoute.self)从NavigationStack的外部修饰,改为添加到NavigationStack内部的根视图(VStack)上,确保导航栈能正确识别该路由类型的目标视图。
内容的提问来源于stack exchange,提问作者Aaron Bratcher
相关产品推荐
相关产品推荐

