Macos 如何切换NavigationView第三个窗格的可见性?
假设使用以下NavigationView:Macos 如何切换NavigationView第三个窗格的可见性?,macos,swiftui,appkit,Macos,Swiftui,Appkit,假设使用以下NavigationView: Struct ContentView:View{ @状态变量showRigthPane:Bool=true var body:一些观点{ 导航视图{ 边栏() 中间窗格() 右窗格() }.工具栏{ 工具栏项(位置:。导航){ 按钮(操作:toggleSidebar,标签:{Image(systemName:“sidebar.left”)}) } 工具栏项(位置:.primaryAction){ 按钮(操作:self.toggleRightPane,标
Struct ContentView:View{
@状态变量showRigthPane:Bool=true
var body:一些观点{
导航视图{
边栏()
中间窗格()
右窗格()
}.工具栏{
工具栏项(位置:。导航){
按钮(操作:toggleSidebar,标签:{Image(systemName:“sidebar.left”)})
}
工具栏项(位置:.primaryAction){
按钮(操作:self.toggleRightPane,标签:{Image()})
}
}
}
private func toggleRightPane(){
// ?
}
//折叠侧边栏-这是有效的
private func toggleSidebar(){
NSApp.keyWindow?.initialFirstResponder?.tryToPerform(
#选择器(NSSplitViewController.toggleSidebar(:)),带:nil)
}
}
如何实现
toggleRightPane()
函数来切换右窗格的可见性?更新后的使用返回两个不同导航视图的计算属性。侧边栏的行为仍然很奇怪,但有了一个解决方案,它就可以正常工作了。希望有人能找出侧边栏的行为
struct ToggleThirdPaneView: View {
@State var showRigthPane: Bool = true
var body: some View {
VStack {
navigationView
}
.navigationTitle("Show and Hide")
}
var navigationView : some View {
if showRigthPane {
return AnyView(NavigationView {
VStack {
Text("left")
}
.toolbar {
Button(action: { showRigthPane.toggle() }) {
Label("Add Item", systemImage: showRigthPane ? "rectangle.split.3x1" : "rectangle.split.2x1")
}
}
Text("middle")
}
)
} else {
return AnyView(NavigationView {
VStack {
Text("left")
}
.toolbar {
Button(action: { showRigthPane.toggle() }) {
Label("Add Item", systemImage: showRigthPane ? "rectangle.split.3x1" : "rectangle.split.2x1")
}
}
Text("middle")
Text("right")
})
}
}
}
尝试以下操作(无法测试)
struct ContentView:View{
@状态私有变量showRigthPane=true
var body:一些观点{
导航视图{
边栏()
中间窗格()
如果showRigthPane{//此方法不关闭右窗格拆分(这是NavigationView的第三个窗格)。因此,即使在切换了showRightPane
boolean之后,您的代码仍然有三个窗格,而第三个窗格现在只有一个空视图。代码已经更新。关闭,但仍然不是100%。请尝试一下。是的,这种方法很有效,但就像您所说的侧边栏看起来很奇怪。我认为解决方案是调用NSSplitViewCont滚动并折叠侧视图,虽然我不知道如何操作。我将编辑我的问题,以显示当前如何关闭侧栏拆分,也许会有帮助。不幸的是,这不起作用,仍然显示三个拆分,右窗格在切换后为空。
struct ContentView: View {
@State private var showRigthPane = true
var body: some View {
NavigationView {
Sidebar()
MiddlePane()
if showRigthPane { // << here !!
RightPane()
}
}.toolbar {
ToolbarItem(placement: .primaryAction) {
Button(action: self.toggleRightPane, label: { Image() })
}
}
}
private func toggleRightPane() {
withAnimation {
self.showRigthPane.toggle() // << here !!
}
}
}