VisionOS应用为何出现两个窗口?预期应为带双标签栏的单窗口
解决VisionOS应用双窗口显示问题
你的VisionOS应用当前显示两个独立窗口,但预期是单窗口内包含双标签页的布局,问题出在TabView的结构嵌套上。
问题原因
在visionOS中,NavigationSplitView会被系统默认识别为独立的窗口容器,你直接将它和第二个List并列放在TabView中,导致系统为这两个组件分别创建了窗口,而非将它们作为TabView的标签项整合在同一个窗口里。
修复代码
// // ContentView.swift // VisionOS // // Created by János Kukoda on 2023. 08. 01.. // import SwiftUI import RealityKit import RealityKitContent struct ContentView: View { @State private var showImmersiveSpace = false @Environment(\.openImmersiveSpace) var openImmersiveSpace @Environment(\.dismissImmersiveSpace) var dismissImmersiveSpace var body: some View { TabView { // 将NavigationSplitView整合成一个完整的标签项 NavigationSplitView { List { Text("Item") } .navigationTitle("Sidebar") } detail: { VStack { Model3D(named: "Scene", bundle: realityKitContentBundle) .padding(.bottom, 50) Text("Hello, world!") Toggle("Show ImmersiveSpace", isOn: $showImmersiveSpace) .toggleStyle(.button) .padding(.top, 50) } .navigationTitle("Content") .padding() } .onChange(of: showImmersiveSpace) { _, newValue in Task { if newValue { await openImmersiveSpace(id: "ImmersiveSpace") } else { await dismissImmersiveSpace() } } } .tabItem { Label("Home", systemImage: "house") } // 第二个标签项 List { Text("Item") } .tabItem { Label("Home", systemImage: "house") } } } } #Preview { ContentView() }
修改说明
- 确保
NavigationSplitView及其所有关联修饰符(onChange、tabItem)是一个完整的视图单元,作为TabView的第一个子项 - 第二个
List保持独立作为第二个标签项,这样TabView就能正确将两个视图合并到同一个窗口中,显示为标签页
问题截图

内容的提问来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

