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

设置preferredCompactColumn为sidebar,iOS端默认显示详情页问题求助

问题描述

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

iPhone端默认显示详情页

附上代码:

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的设置。

修改步骤:

  1. 将selectedSidebarItem的初始值设为nil,而非空字符串:
    @State private var selectedSidebarItem: String? = nil
    
  2. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:11:22