SwiftUI - 三列/侧边栏布局,全部可见?

4
我正在尝试使用SwiftUI的新功能来实现多列侧边栏布局。我知道我可以这样做:
struct SidebarContentView: View {
    
    var body: some View {
        NavigationView {
            List {
                ForEach(0...5, id: \.self) { i in
                    Text("\(i)")
                }
            }
            .listStyle(SidebarListStyle())
            .navigationTitle("List 1")
            
            List {
                ForEach(0...5, id: \.self) { i in
                    Text("\(i)")
                }
            }
            .navigationTitle("List 2")
            
            Text("Hello world")
                .font(.largeTitle)
                .navigationTitle("Content")
        }
        .navigationViewStyle(DoubleColumnNavigationViewStyle())
    }
}

为了创建我的三列布局(两个导航列和一个更大的内容视图),但最初的结果看起来是这样的:

enter image description here

我需要点击“返回”按钮才能使布局呈现如下形式:

enter image description here

我真正希望的是所有三列能同时显示出来,不需要点击任何后退按钮之类的东西,至少在iPad横屏模式下。一个示例可能如下所示:

enter image description here

有人能解释一下我如何实现这样的布局吗?我希望当我的应用在macOS上运行或者在iPad横屏模式下运行时,它是活跃的。在竖屏模式下,我可以接受第一个截图中显示的导航样式,但是否则我想让所有窗格都可见。有什么想法吗?


我相信目前没有编程控制它的方法。默认情况下,主视图不会可见。 - Tushar Sharma
如果您需要,我可以以自定义方式解决问题,而不使用NavigationView!但是我不确定我能否在2天内完成它!因为有多设备平台,包括macOS、iPad和iPhone。 - ios coder
1
使用 SwiftUI 原生视图 (视图、列表、滚动、堆栈、按钮...),您可以创建任何您想要的布局,不要依赖于沉重的默认视图 (堆栈、工具栏、导航)。就我的经验而言,它们仍然不稳定且很难自定义。 - Quang Hà
2
也许Alex Grebenyuk的文章能有所帮助:三重麻烦 - Stephan Michels
2
@QuangHà:没错,修复已上线的错误所需的时间比从零开始构建自定义 View 要多得多! - ios coder
1个回答

2

更新:更好的解决方案

extension UISplitViewController {
    open override func viewDidLoad() {
        super.viewDidLoad()
        self.show(.primary)        
    }
}

===========================

看一下这个 GitHub 项目:SwiftUI-Introspect

import Introspect

@main
struct ExampleApp: App {
    var body: some Scene {
        WindowGroup {
            NavigationView {
                Text("Primary View")
                Text("Supplementary View")
                Text("Secondary View")
                    // show primary view at startup
                    .introspectSplitViewController(customize: { splitViewController in
                        splitViewController.show(.primary)
                    })
            }
        }
    }
}
// Implement UISplitViewControlle selector
extension View {
    public func introspectSplitViewController(customize: @escaping (UISplitViewController) -> ()) -> some View {
        return inject(UIKitIntrospectionViewController(
            selector: { introspectionViewController in
                
                // Search in ancestors
                if let splitViewController = introspectionViewController.splitViewController {
                    return splitViewController
                }
                
                // Search in siblings
                return Introspect.previousSibling(containing: UISplitViewController.self, from: introspectionViewController)
            },
            customize: customize
        ))
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接