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

删除Main.storyboard后AppDelegate的applicationDidFinishLaunching未触发怎么办?

问题根源与解决方案

没错!你删除Info.plist里的Main storyboard file base name正是导致AppDelegate完全失效的核心原因。

为什么会这样?

默认情况下,macOS依靠这个Info.plist配置串联应用的启动流程:系统会加载指定的storyboard,同时自动将@NSApplicationMain标记的AppDelegate关联到NSApplication实例上。当你移除这个配置后,系统失去了默认的启动入口指引,@NSApplicationMain的语法糖直接失效——它没办法自动把你的AppDelegate绑定到应用上,自然applicationDidFinishLaunching这些委托方法不会被触发,应用也没有界面。

怎么解决?

你需要手动接管应用的启动流程,分两步就能搞定:

  1. 创建自定义的main入口文件
    在项目里新建一个main.swift文件(如果已有就直接修改),替换掉@NSApplicationMain的自动生成逻辑:

    import Cocoa
    
    // 初始化应用实例
    let app = NSApplication.shared
    // 实例化你的AppDelegate
    let appDelegate = AppDelegate()
    // 手动绑定委托
    app.delegate = appDelegate
    // 启动应用事件循环
    NSApp.run()
    

    注意:要把原来AppDelegate类上的@NSApplicationMain标记删掉!

  2. 在AppDelegate里手动创建主窗口
    现在你的AppDelegate会被正常调用了,在applicationDidFinishLaunching里添加窗口创建代码,让应用显示界面:

    class AppDelegate: NSObject, NSApplicationDelegate {
        func applicationDidFinishLaunching(_ aNotification: Notification) {
            print("OK") // 现在这个打印会正常输出了!
            
            // 创建主窗口
            let mainWindow = NSWindow(
                contentRect: NSRect(x: 0, y: 0, width: 800, height: 600),
                styleMask: [.titled, .closable, .miniaturizable, .resizable],
                backing: .buffered, defer: false
            )
            mainWindow.center() // 窗口居中显示
            mainWindow.title = "My Custom macOS App"
            mainWindow.makeKeyAndOrderFront(nil) // 显示窗口
        }
    }
    
  3. 最后检查编译设置
    确保项目的"Build Settings"里,"Main Interface"选项是空的(因为我们已经完全抛弃storyboard了),同时main.swift已经被包含在项目的编译源文件中。

做完这些操作后,重新构建运行,你会看到OK的调试输出,同时自定义的主窗口也会正常显示了。

内容的提问来源于stack exchange,提问作者Efim Plotnikov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:46:17