You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:08:17