SwiftUI:使用侧边栏 Visible 启动三列 iPad 应用程序

问题描述

使用下面的代码可以创建一个基本的三列 iPad 布局。

@main
struct threepanelApp: App {
    var body: some Scene {
        WindowGroup {
            NavigationView {
                List(0..<10,rowContent: { i in
                    Text(String(describing: i))
                })
                .listStyle(SidebarListStyle())
                .navigationTitle("One")
                
                List(10..<20,rowContent: { i in
                    Text(String(describing: i))
                })
                .navigationTitle("Two")

                vstack {
                    Text("Panel Three")
                }
                .navigationTitle("Three")
            }
        }
    }
}

但是,当应用启动时,它会以两列布局进行操作。

Two Column

我想要实现的是应用以三列布局启动:

Three Column

这可以通过 SwiftUI 2 实现吗?

解决方法

想出了一个hacky的方法来做到这一点:

浸入 .UIKit 中的 onAppear,找到 UISplitViewController,并设置它的 preferredDisplayMode

var body: some Scene {
        WindowGroup {
            NavigationView {
                List(0..<10,rowContent: { i in
                    Text(String(describing: i))
                })
                .navigationTitle("One")

                ListTwo()

                VStack {
                    Text("Panel Three")
                }
                .navigationTitle("Three")
            }.onAppear {
                let controller = UIApplication.shared.windows.first { $0.isKeyWindow }!.rootViewController
                guard let split = controller?.children[0] as? UISplitViewController else {
                    print("not a split view")
                    return
                }
                split.preferredDisplayMode = .twoBesideSecondary
            }
        }
    }
,

添加此扩展程序时,所有内容都会在应用程序启动时展开:

extension UISplitViewController {

    open override func viewDidLoad() {
        super.viewDidLoad()
        preferredDisplayMode = .twoBesideSecondary
    }
}