iPadOS - 在 SwiftUI 中以编程方式关闭侧边栏

lcp*_*nix 6 sidebar ipad swiftui

我正在制作一个可以在 iOS 和iPadOS中使用SwiftUI.navigationViewStyle(DoubleColumnNavigationViewStyle())完美运行的应用程序,但是在 iPad 中,当我使用修饰符时,会出现一个侧边栏,NavigationView我想知道是否有办法以编程方式关闭侧边栏,通常用户可以通过触摸屏幕左上角的按钮来关闭侧边栏,但这就是用户交互。可以直接用代码关闭侧边栏吗?

发现SwiftUI-Introspect可以用来完成这个要求,但我想在没有外部库的情况下完成它。

这是在iPadOS中重现侧边栏的简单代码:

import SwiftUI
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            NavigationView {
                if UIDevice.current.userInterfaceIdiom == .pad {
                    Text("Sidebar here")
                    Text("Content here")
                }
            }.navigationViewStyle(DoubleColumnNavigationViewStyle())
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

mat*_*rda 3

我尝试使用这段代码并且它有效:

import SwiftUI

struct TestView: View {
    static var uiSplitViewController: UISplitViewController? = nil
    
    var body: some View {
        NavigationView {
            Text("Sidebar")
        
            VStack {
                Button(action: {
                    TestView.uiSplitViewController?.hide(.primary)
                }, label: {
                    Text("Hide")
                })
                
                Button(action: {
                    TestView.uiSplitViewController?.show(.primary)
                }, label: {
                    Text("Show")
                })
            }
        }
        
    }
}

extension UISplitViewController {
    open override func viewDidLoad() {
        super.viewDidLoad()
        
        if (TestView.uiSplitViewController == nil) {
            TestView.uiSplitViewController = self
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是正确的方法。我所做的就是UISplitViewController在视图中扩展并保存它的实例,这样我就可以用它来隐藏或显示侧边栏。我希望能有用!