设置preferredCompactColumn为sidebar,iOS端默认显示详情页问题求助
问题描述
我已将preferredColumn设置为NavigationSplitViewColumn.sidebar,但在iPhone 15 Pro预览中,默认显示的是NavigationSplitViewColumn.detail,用户需要点击顶部的返回按钮才能切换到侧边栏视图。

附上代码:
struct ContentView: View { @State private var selectedSidebarItem: String? = "" @State private var isExpanded: Bool = true @State private var preferredColumn = NavigationSplitViewColumn.sidebar private var toolbarTitle: String { switch selectedSidebarItem { case "UrlToSummaryView": return "URL to Summary" case "GenerateShortStoryView": return "Generate a Short Story" case "YoutubeVideoToSummaryView": return "Youtube Video to Summary" case "GenerateIdeasView": return "Generate Ideas" default: return "" } } var body: some View { NavigationSplitView(preferredCompactColumn: $preferredColumn) { List(selection: $selectedSidebarItem) { DisclosureGroup("Tasks", isExpanded: $isExpanded) { NavigationLink(value: "UrlToSummaryView") { HStack { Image(systemName: "link") Text("URL to summary") } } NavigationLink(value: "GenerateShortStoryView") { HStack { Image(systemName: "chart.bar.doc.horizontal") Text("Generate a short story") } } NavigationLink(value: "YoutubeVideoToSummaryView") { HStack { Image(systemName: "video") Text("Youtube video to summary") } } NavigationLink(value: "GenerateIdeasView") { HStack { Image(systemName: "brain.filled.head.profile") Text("Generate ideas") } } } } .navigationTitle("Butler") } content: { Text("Hello") } detail: { if let selectedSidebarItem { switch selectedSidebarItem { case "UrlToSummaryView": ToolbarWrapper(title: "URL to summary") { UrlToSummaryView() } case "GenerateShortStoryView": ToolbarWrapper(title: "Generate a Short Story") { GenerateShortStoryView() } case "YoutubeVideoToSummaryView": ToolbarWrapper(title: "Youtube Video to Summary") { YoutubeVideoToSummaryView() } case "GenerateIdeasView": ToolbarWrapper(title: "Generate Ideas") { GenerateIdeasView() } default: Button("Sidebar") { preferredColumn = NavigationSplitViewColumn.content } } } else { Text("") } } .navigationSplitViewStyle(.balanced) } }
期望:iPhone端默认显示侧边栏视图。
解决方案
问题根源是你初始化时给selectedSidebarItem赋值了空字符串"",这会触发detail区域的渲染,直接覆盖preferredCompactColumn的设置。
修改步骤:
- 将
selectedSidebarItem的初始值设为nil,而非空字符串:@State private var selectedSidebarItem: String? = nil - 调整
detail区域的默认提示文本(可选),同时修正默认按钮的目标列值:
修改后的完整代码:
struct ContentView: View { @State private var selectedSidebarItem: String? = nil @State private var isExpanded: Bool = true @State private var preferredColumn = NavigationSplitViewColumn.sidebar private var toolbarTitle: String { switch selectedSidebarItem { case "UrlToSummaryView": return "URL to Summary" case "GenerateShortStoryView": return "Generate a Short Story" case "YoutubeVideoToSummaryView": return "Youtube Video to Summary" case "GenerateIdeasView": return "Generate Ideas" default: return "" } } var body: some View { NavigationSplitView(preferredCompactColumn: $preferredColumn) { List(selection: $selectedSidebarItem) { DisclosureGroup("Tasks", isExpanded: $isExpanded) { NavigationLink(value: "UrlToSummaryView") { HStack { Image(systemName: "link") Text("URL to summary") } } NavigationLink(value: "GenerateShortStoryView") { HStack { Image(systemName: "chart.bar.doc.horizontal") Text("Generate a short story") } } NavigationLink(value: "YoutubeVideoToSummaryView") { HStack { Image(systemName: "video") Text("Youtube video to summary") } } NavigationLink(value: "GenerateIdeasView") { HStack { Image(systemName: "brain.filled.head.profile") Text("Generate ideas") } } } } .navigationTitle("Butler") } content: { Text("Hello") } detail: { if let selectedSidebarItem { switch selectedSidebarItem { case "UrlToSummaryView": ToolbarWrapper(title: "URL to summary") { UrlToSummaryView() } case "GenerateShortStoryView": ToolbarWrapper(title: "Generate a Short Story") { GenerateShortStoryView() } case "YoutubeVideoToSummaryView": ToolbarWrapper(title: "Youtube Video to Summary") { YoutubeVideoToSummaryView() } case "GenerateIdeasView": ToolbarWrapper(title: "Generate Ideas") { GenerateIdeasView() } default: Button("Sidebar") { preferredColumn = NavigationSplitViewColumn.sidebar } } } else { Text("请从侧边栏选择功能") } } } }
修改后,iPhone启动时会因为没有选中任何侧边栏项,遵循preferredCompactColumn的设置默认展示侧边栏。
内容的提问来源于stack exchange,提问作者Manoj Singh Negi
相关产品推荐
相关产品推荐

