Sample CodevisionOSReviewed 2026-07-21View on Apple Developer

Creating SwiftUI windows in visionOS

At a glance

Item Summary
Purpose Display and manage multiple SwiftUI windows in your visionOS app.
App architecture A code-light SwiftUI sample: EntryPoint declares WindowGroup, MainView owns the visible behavior, and there is no separate service or persistence layer.
Main patterns SwiftUI scene composition
Project style Code-light sample with 4 scanned Swift file(s) and 97 Swift line(s); resources and generated assets are excluded from those counts.

Project structure

Source bundle/
└── Creating New Windows/
    ├── App/
    │   └── EntryPoint.swift  # EntryPoint
    └── Views/
        ├── OpenWindowView.swift  # OpenWindowView, NewWindowID
        ├── MainView.swift  # MainView
        └── NewWindowView.swift  # NewWindowView

Structure observations

  • The runtime boundary is WindowGroup; the pruned tree lists only files that explain lifecycle, state, or framework integration.
  • App code is compact; any explicit model, provider, or entity owner is still shown below rather than collapsed into view-local state.

Overall architecture

Reference code

Creating New Windows/App/EntryPoint.swift:11 — the app or executable entry declares the outer scene lifecycle.

struct EntryPoint: App {
    // ...
}

The diagram is a responsibility flow, not a claim that every adjacent node directly calls the next. It keeps scene ownership, shared state, RealityKit content, and framework-provider work at separate levels.

Ownership and state

Ownership evidence

Creating New Windows/Views/OpenWindowView.swift:14 — representative stored state or the nearest verified lifecycle anchor.

struct OpenWindowView: View {
    // ...
    @State var nextWindowID = NewWindowID(id: 1)
    // ...
}
Owner Object or state Relationship Mutation authority
OpenWindowView NewWindowID as nextWindowID creates and retains The owning type coordinates writes

Ownership here is deliberately narrow: @Environment and weak references are shared links, initialized @State or stored services are lifecycle ownership, and a RealityView content closure owns additions to its entity graph without making the SwiftUI view a reference-type owner.

Class and protocol design

Type Responsibility Depends on or conforms to
EntryPoint (Creating New Windows/App/EntryPoint.swift:11) Declares app scenes and top-level dependency lifetime. App
MainView (Creating New Windows/Views/MainView.swift:10) Presents UI and forwards gestures or lifecycle events. View
NewWindowView (Creating New Windows/Views/NewWindowView.swift:11) Presents UI and forwards gestures or lifecycle events. View
OpenWindowView (Creating New Windows/Views/OpenWindowView.swift:12) Presents UI and forwards gestures or lifecycle events. View

The source defines no local substitution protocol in the reviewed boundary. Its protocol use is framework-facing (App, View, RealityKit/ARKit protocols, or platform adapters), so this document does not label the whole app protocol-oriented.

Access control

Symbol Access Verified effect Likely rationale
@Environment(\.openWindow) private var openWindow (Creating New Windows/Views/OpenWindowView.swift:17) private Use is restricted to the declaration and same-file extensions permitted by Swift. Inference: Hide implementation details and lifecycle-sensitive state.

No reviewed declaration uses fileprivate, private(set), public, open; unmodified Swift declarations are internal.

Reference code

Creating New Windows/Views/OpenWindowView.swift:17 — representative visibility boundary.

struct OpenWindowView: View {
    // ...
    @Environment(\.openWindow) private var openWindow
    // ...
}

Logic ownership and placement

Logic Owning type or file Placement rationale
Scene declaration and dependency lifetime EntryPoint The App/entry boundary determines window, volume, and immersive-space lifetime.
Presentation, attachments, and gestures MainView SwiftUI view code forwards user intent and RealityView lifecycle events.

Design patterns

Pattern Source evidence Purpose or tradeoff
SwiftUI scene composition Creating New Windows/App/EntryPoint.swift:11 Keeps windows, volumes, and immersive-space lifecycle visible at the app boundary.

Naming conventions

  • Role suffixes are evidence, not decoration: View: MainView, NewWindowView, OpenWindowView.
  • Protocols: no app-defined protocol in the reviewed source.
  • Commands use verb-led methods: the code-light sample has no separate command layer.
  • Files generally match their primary type; Views, Models, Managers, Providers, Components, Systems, and Packages folders describe architectural roles where present.

Architecture takeaways

  • Treat EntryPoint as the owner of scene declarations, not as the owner of every RealityKit entity created later.
  • Keep view-local interaction in SwiftUI, but move provider sessions, playback resources, shared game state, or transport state into a stable owner when their lifetime exceeds one render pass.
  • The compact source does not justify adding repository, coordinator, or protocol layers beyond the model, provider, or view boundary the sample actually declares.

Source map

Source file Relevant symbols
Creating New Windows/App/EntryPoint.swift:11 EntryPoint
Creating New Windows/Views/OpenWindowView.swift:12 OpenWindowView, NewWindowID
Creating New Windows/Views/MainView.swift:10 MainView
Creating New Windows/Views/NewWindowView.swift:11 NewWindowView