swiftui - SwiftUI 中具有不同列的侧边栏

标签 swiftui sidebar

我正在使用 SwiftUI 2 附带的新侧边栏以及在三列大屏幕中导航的可能性。有关其工作原理的示例可以在这里找到: https://www.hackingwithswift.com/quick-start/swiftui/how-to-add-a-sidebar-for-ipados

它工作正常,但我想向前迈出一步,在我的主菜单中制作一些选项,显示三列,但其他选项只有两个。

这里是一些演示代码的示例。

import SwiftUI

struct ContentView: View {
    var body: some View{
        NavigationView{
            List{
                Section(header: Text("Three columns")){
                    NavigationLink(
                        destination: ItemsView(),
                        label: {
                            Label("Animals",systemImage: "tortoise")
                        })
                    NavigationLink(
                        destination: ItemsView(),
                        label: {
                            Label("Animals 2",systemImage: "hare")
                        })
                }
                Section(header: Text("Two columns")){
                    NavigationLink(
                        destination: Text("I want to see here a single view, without detail"),
                        label: {
                            Label("Settings",systemImage: "gear")
                        })
                    NavigationLink(
                        destination: Text("I want to see here a single view, without detail"),
                        label: {
                            Label("Settings 2",systemImage: "gearshape")
                        })
                }
            }
            .listStyle(SidebarListStyle())
            .navigationBarTitle("App Menu")
            
            ItemsView()
            DetailView(animal: "default")
            
        }
    }
}

struct ItemsView: View{
    let animals = ["Dog", "Cat", "Lion", "Squirrel"]
    var body: some View{
        List{
            ForEach(animals, id: \.self){ animal in
                NavigationLink(
                    destination: DetailView(animal: animal)){
                    Text(animal)
                }
            }
        }
        .listStyle(PlainListStyle())
        .navigationTitle("Animals")
    }
}

struct DetailView: View{
    var animal: String
    var body: some View{
        VStack{
            Text("🐕")
                .font(.title)
                .padding()
            Text(animal)
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .previewLayout(.sizeThatFits)
    }
}

例如,如果您在 iPad Pro(12.9 英寸)的横向模式下运行代码,您可以看到树列。首先是应用程序菜单(侧边栏)。如果单击前两个选项之一(动物和动物 2),您可以看到动物列表(第二列),当您单击某些动物时,您将到达第三列(详细 View )。 但是,当我单击菜单的最后两个选项(“设置”和“设置 2”)时,我只想显示两列。有任何线索如何实现它吗?

如果未选择菜单中的某些第一个选项(使用 NavigationLink 中的选定参数),我尝试隐藏该部分,但没有成功。似乎不可能(或者我不知道)知道在侧栏中选择了哪个选项。

欢迎任何想法!

最佳答案

我花了几天时间才弄清楚。

在不同的iPad设备和多任务模式上测试,一切正常。(iOS14+,尚未在iOS13上测试)

最小示例:

extension UISplitViewController {
    open override func viewDidLoad() {
        super.viewDidLoad()
        self.show(.primary) // show sidebar, this is the key, toke me days to find this...
        self.showsSecondaryOnlyButton = true
    }
}

struct ContentView: View {
    @State var column: Int = 3
    var body: some View {
        switch column {
        case 3: // Triple Column
            NavigationView {
                List {
                    HStack {
                        Text("Triple")
                    }
                    .onTapGesture {
                        column = 3
                    }
                    HStack {
                        Text("Double")
                    }
                    .onTapGesture {
                        column = 2
                    }
                }
                Text("Supplementary View")
                Text("Detail View")
            }
        default: // Double Column
            NavigationView {
                List {
                    HStack {
                        Text("Triple")
                    }
                    .onTapGesture {
                        column = 3
                    }
                    HStack {
                        Text("Double")
                    }
                    .onTapGesture {
                        column = 2
                    }
                }
                Text("Supplementary View")
            }
        }
    }
}

我的另一个答案:设置侧边栏默认选定的项目。

结合这两个解决方案,我构建了一个 2&3 列共存样式的应用程序。

SwiftUI, selecting a row in a List programmatically

关于swiftui - SwiftUI 中具有不同列的侧边栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62978592/

相关文章:

ios - 如何检测返回到 SwiftUI 中 NavigationView 的 Root View ?

javascript - 语义 UI 侧边栏组件在切换时不保留背景颜色

swift - 在 iOS16.4 中 TextField 内的电子邮件提示呈现蓝色

ios - 使用 SwiftUI 显示 .epub 文件

php - Woocommerce:将类别缩略图添加到产品页面的侧边栏

python - 您可以在 Sphinx 侧边栏中重命名 "table of contents"吗?

javascript - 如何在谷歌地图上创建右侧菜单侧边栏

xcode - 简单的 SwiftUI 转换似乎不起作用

swift - 更新 View 时处理单击和双击