SwiftUI macOS 检测窗口关闭

use*_*037 6 macos swiftui

目的:

  • 我有一个使用 Window 场景的 swiftUI 应用程序
  • 当用户关闭红色窗口时,我想打电话f1()

我的尝试:

onDisappear当用户关闭 macOS 应用程序窗口时似乎不会被调用

问题:

  1. 在 macOS (SwiftUI) 中,如何检测用户关闭窗口?
  2. 我错过了什么吗?

代码

应用程序

@main
struct DemoApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        
        Window("test", id: "test") {
            Color.red
                .onDisappear {
                    print("onDisappear")
                    f1()
                }
        }
    }
    
    func f1() {
        print("f1 called")
    }
}
Run Code Online (Sandbox Code Playgroud)

内容视图

struct ContentView: View {
    @Environment(\.openWindow) private var openWindow
    var body: some View {
        Button("show red") {
            openWindow(id: "test")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*eck 6

对于执行此操作的“SwiftUI 方式”,请查看环境属性controlActiveState.inactive当窗口失去焦点以及窗口关闭时,将设置该值。

struct ContentView: View {
    @Environment(\.controlActiveState) private var controlActiveState

    var body: some View {
        Text("Hello, World!")
            .onChange(of: controlActiveState) { newValue in
                switch newValue {
                case .key, .active:
                    break
                case .inactive:
                    // Do your stuff.
                @unknown default:
                    break
                }
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • “非活动”并不意味着窗口已关闭...所以问题仍然没有得到解答,如何区分 CLOSED 和 INACTIVE ??? (3认同)