SwiftUI:检查 WINDOW(非应用程序)是否激活(成为前台)的方法

And*_*rew 3 macos swift swiftui

当我的应用程序变为前台时,我需要调用一些事件方法

(我为每个视图使用 ViewModel,所以我不仅可以从视图调用某些东西)

例如:

  1. 我的应用程序已运行;

  2. 将前台窗口更改为 Safari 应用程序。

  3. 将前台窗口更改为我的应用程序 - >调用一些方法。

.onChange(of: scenePhase) -> .active这种情况下什么也没有发生

所以这些代码对我来说不是解决方案:

struct ContentView: View {
    @Environment(\.scenePhase) private var scenePhase
    var body: some View {
        TestView()
            .onChange(of: scenePhase) { phase in
                switch phase {
                    case .active:
                        print("App is active")
                    default:
                        break
                }
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*037 7

您可以按如下方式使用环境变量controlActiveState

@Environment(\.controlActiveState) var controlActiveState
Run Code Online (Sandbox Code Playgroud)


And*_*rew 5

方式一:

(更好的)

您可以将自定义 AppDelegate 与函数一起使用applicationDidBecomeActive

主应用程序文件:

import SwiftUI

@main
struct FileBoApp: App {
//SOLUTION p1
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate : AppDelegate
//END SOLUTION p1
    
    var body: some Scene {
        /// bla bla bla
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序委托文件:

import Foundation
import SwiftUI

//SOLUTION p2
class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidBecomeActive(_ notification: Notification) {
       print("FUUUUUUUUUUUU")
    }
}
//END SOLUTION p2

Run Code Online (Sandbox Code Playgroud)

===============================================


方式二:

( 选择 )

    @SceneBuilder var body: some Scene {
        WindowGroup {
            SomeView()
//SOLUTION
                .onReceive(NotificationCenter.default.publisher(for: NSApplication.didBecomeActiveNotification)) { (_) in
                          print("FUUUUUUUUUUUU")
                        }
//END SOLUTION
            
        }
Run Code Online (Sandbox Code Playgroud)