macOS Cocoa中如何监听窗口加载完成并接收通知?
在macOS Cocoa中实现类似SwiftUI .onAppear的窗口加载完成通知
SwiftUI 中的 .onAppear 修饰器可以让我们知晓视图何时出现,我希望在 macOS Cocoa 中实现相同的监听逻辑。虽然 AppDelegate 提供了 applicationDidFinishLaunching 方法,但我需要窗口级别的对应方法(类似 windowDidFinishLaunching),目标是在名为 About 的窗口完全加载并显示到屏幕上时收到通知。
以下是我的现有代码:
import Cocoa import SwiftUI class AppDelegate: NSObject, NSApplicationDelegate { private var window: NSWindow! func applicationDidFinishLaunching(_ aNotification: Notification) { buildMainMenu() buildWindow() } func buildWindow() { window = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 100.0, height: 100.0), styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView], backing: .buffered, defer: false) window.setFrameAutosaveName("Main Window") window.title = "No Storyboard Window" window.makeKeyAndOrderFront(window) window.center() } func buildMainMenu() { let appMainMenu: NSMenu = NSMenu() let mainMenu: NSMenuItem = NSMenuItem() mainMenu.submenu = NSMenu(title: "MainMenu") let mainMenuItem0 = NSMenuItem(title: "About", action: #selector(NSApplication.about), keyEquivalent: "a") mainMenuItem0.keyEquivalentModifierMask = .command let mainMenuItem1 = NSMenuItem(title: "Close", action: #selector(NSWindow.performClose(_:)), keyEquivalent: "w") mainMenuItem1.keyEquivalentModifierMask = .command let mainMenuItem2 = NSMenuItem(title: "Quit", action: #selector(NSApplication.shared.terminate(_:)), keyEquivalent: "q") mainMenuItem2.keyEquivalentModifierMask = .command mainMenu.submenu?.items = [mainMenuItem0, mainMenuItem1, mainMenuItem2] appMainMenu.items = [mainMenu] NSApp.mainMenu = appMainMenu } } extension NSApplication { @objc func about() { AboutView().openInWindow(title: "About My App", sender: self) } } struct AboutView: View { var body: some View { Color.green } } extension View { @discardableResult func openInWindow(title: String, sender: Any?) -> NSWindow { let window = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 100.0, height: 100.0), styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView], backing: .buffered, defer: false) window.makeKeyAndOrderFront(window) window.center() window.setFrameAutosaveName("Main Window") window.title = "No Storyboard Window" window.contentView = NSHostingView(rootView: self) return window } }
应用的主启动文件代码如下:
import Cocoa // **** Main **** // let nsApplication = NSApplication.shared let appDelegate = AppDelegate() nsApplication.delegate = appDelegate nsApplication.run()
内容的提问来源于stack exchange,提问作者swiftPunk
相关产品推荐
相关产品推荐

