求详情视图集成NavigationStack的可用NavigationSplitView实现方案
有没有人能提供一个可正常运行的、详情视图集成了NavigationStack的NavigationSplitView实现?无论怎么配置,复杂的三列NavigationSplitView搭配NavigationStack总会出现崩溃或者工作流不一致的问题,具体场景如下:
- 侧边栏选择决定内容栏展示的内容(或功能)
- 当前选中的内容(或功能)可控制详情栏的内容
- 详情栏需支持导航,且
navigationDestinations依赖各功能(选中的内容),无法统一注册至单个根节点
我已经尝试了几种方案,但都存在问题:
基础结构代码
@State var sideBar: SideBar? @State var content: Content? NavigationSplitView( sidebar: { List(sidebar) { ... } }, content: { switch sidebar { ... } }, detail: { XXX what to put here? } ).navigationSplitViewStyle(.balanced)
每个侧边栏对应一组专属路由,因此我在详情栏尝试了多种配置:
方案1:详情栏内根据侧边栏切换NavigationStack
// 此方案无效,NavigationStack无法被完全移除或重建 // 它与Scene绑定,切换侧边栏时会崩溃 detail: { switch sidebar { case .a: NavigationStack { View() .navigationDestination(... } } }
方案2:绑定navigationPath的NavigationStack
// 切换侧边栏前清空navigationPath,但仍无法控制详情栏内的NavigationStack,无任何效果 detail: { switch sidebar { case .a: NavigationStack(navigationPath) { View() .navigationDestination(... } } }
方案3:详情栏放空NavigationStack,内容栏注册导航目标
// 此方案可运行,但切换侧边栏时偶尔崩溃,或因导航目标不可用显示警告三角 content: { switch sidebar { case .a: RootView() .navigationDestination(...) } }, detail: { NavigationStack { } }
方案4:绑定navigationPath的空NavigationStack
// 尝试切换前清空路径,同样无效 content: { switch sidebar { case .a: RootView() .navigationDestination(...) } }, detail: { NavigationStack(navigationPath) { } }
内容的提问来源于stack exchange,提问作者GeorgeJ
相关产品推荐
相关产品推荐

