Skip to content

Instantly share code, notes, and snippets.

@Matt54
Last active May 17, 2024 21:32
Show Gist options
  • Save Matt54/dbf490f9e9d4dce91f37df7896fd4875 to your computer and use it in GitHub Desktop.
Save Matt54/dbf490f9e9d4dce91f37df7896fd4875 to your computer and use it in GitHub Desktop.
Keeping track of visionOS windows being opened/closed
import SwiftUI
import RealityKit
import RealityKitContent
@main
struct WindowWatchingApp: App {
@State private var windowManager: WindowManager
init() {
_windowManager = State(initialValue: WindowManager())
}
var body: some SwiftUI.Scene {
WindowGroup(id: "WindowA") {
WindowA()
.environment(windowManager)
}
.windowResizability(.contentSize)
WindowGroup(id: "WindowB") {
WindowB()
.environment(windowManager)
}
.windowResizability(.contentSize)
}
}
@Observable
class WindowManager {
var isWindowAOpen: Bool = false
var isWindowBOpen: Bool = false
}
struct WindowA: View {
@Environment(WindowManager.self) var windowManager
@Environment(\.openWindow) var openWindow
@Environment(\.scenePhase) private var scenePhase
var body: some View {
VStack {
Text("Window A").font(.title)
Button(action: {
openWindow(id: "WindowB")
}, label: {
Text("Open Window B")
})
.disabled(windowManager.isWindowBOpen)
}
.padding()
.onAppear {
windowManager.isWindowAOpen = true
print("onAppear: windowManager.isWindowAOpen = \(windowManager.isWindowAOpen)")
}
.onDisappear {
windowManager.isWindowAOpen = false
print("onDisappear: windowManager.isWindowAOpen = \(windowManager.isWindowAOpen)")
}
.onChange(of: scenePhase) { oldValue, newValue in
print("Window A scene: \(newValue)")
if newValue == .background && !windowManager.isWindowBOpen {
// if you need to do something when the last window is closed
print("ALL WINDOWS ARE CLOSED")
windowManager.isWindowAOpen = false
} else if newValue == .active {
windowManager.isWindowAOpen = true
}
}
}
}
struct WindowB: View {
@Environment(WindowManager.self) var windowManager
@Environment(\.openWindow) var openWindow
@Environment(\.scenePhase) private var scenePhase
var body: some View {
VStack {
Text("Window B").font(.title)
Button(action: {
openWindow(id: "WindowA")
}, label: {
Text("Open Window A")
})
.disabled(windowManager.isWindowAOpen)
}
.padding()
.onAppear {
windowManager.isWindowBOpen = true
print("onAppear: windowManager.isWindowBOpen = \(windowManager.isWindowBOpen)")
}
.onDisappear {
windowManager.isWindowBOpen = false
print("onDisappear: windowManager.isWindowBOpen = \(windowManager.isWindowBOpen)")
}
.onChange(of: scenePhase) { oldValue, newValue in
print("Window B scene: \(newValue)")
if newValue == .background && !windowManager.isWindowAOpen {
// if you need to do something when the last window is closed
print("ALL WINDOWS ARE CLOSED")
windowManager.isWindowBOpen = false
} else if newValue == .active {
windowManager.isWindowBOpen = true
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment