You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 13:43:25