You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:41:46