NavigationSplitView切换触发AnyNavigationPath类型不匹配崩溃求助
报错信息:
SwiftUI/NavigationColumnState.swift:520: Fatal error: 'try!' expression unexpectedly raised an error: SwiftUI.AnyNavigationPath.Error.comparisonTypeMismatch`
当NavigationSplitView的详情视图切换时,若即将离开的详情视图包含NavigationStack(path: ...),就会触发上述致命错误。我怀疑这是SwiftUI的Bug,但也可能是代码实现存在问题,希望能找到解决办法或规避方案。
环境信息
- Xcode:Version 14.3 (14E222b)
- 运行环境:iPad Air(第5代)模拟器 / 适配iPad的Mac
代码实现
Models
import SwiftUI final class AppModel: ObservableObject { @Published var appNavigation: AppNavigation? = .lists @Published var listsNavigation: [ListsNavigation] = [] @Published var settingsNavigation: [SettingsNavigation] = [] } enum AppNavigation { case lists, settings } enum SettingsNavigation { case settings1, settings2 } enum ListsNavigation { case favourites, notes }
App.swift
import SwiftUI @main struct splittyApp: App { @StateObject private var model = AppModel() var body: some Scene { WindowGroup { NavigationSplitView { List(selection: $model.appNavigation) { NavigationLink(value: AppNavigation.lists) { Label("Lists", systemImage: "list.clipboard") } NavigationLink(value: AppNavigation.settings) { Label("Settings", systemImage: "gearshape") } } } detail: { switch model.appNavigation { case .lists: ListsView() case .settings: SettingsView() case .none: Text("Error") } } .environmentObject(model) } } }
ListsView
import SwiftUI struct ListsView: View { @EnvironmentObject private var model: AppModel var body: some View { NavigationStack(path: $model.listsNavigation) { List { NavigationLink(value: ListsNavigation.favourites) { Text("Favourites") } NavigationLink(value: ListsNavigation.notes) { Text("Notes") } } .navigationDestination(for: ListsNavigation.self) { value in switch value { case .favourites: Text("Favourites View") case .notes: Text("Notes View") } } } } }
SettingsView
import SwiftUI struct SettingsView: View { @EnvironmentObject private var model: AppModel var body: some View { NavigationStack(path: $model.settingsNavigation) { List { NavigationLink(value: SettingsNavigation.settings1) { Text("Settings 1") } NavigationLink(value: SettingsNavigation.settings2) { Text("Settings 2") } } .navigationDestination(for: SettingsNavigation.self) { value in switch value { case .settings1: Text("Settings 1") case .settings2: Text("Setings 2") } } } } }
重现步骤
- 在iPad模拟器或适配iPad的Mac上启动应用
- 在主导航(Lists/Settings)之间来回切换
内容的提问来源于stack exchange,提问作者lacking-cypher
相关产品推荐
相关产品推荐

