删除Main.storyboard后AppDelegate的applicationDidFinishLaunching未触发怎么办?
没错!你删除Info.plist里的Main storyboard file base name正是导致AppDelegate完全失效的核心原因。
为什么会这样?
默认情况下,macOS依靠这个Info.plist配置串联应用的启动流程:系统会加载指定的storyboard,同时自动将@NSApplicationMain标记的AppDelegate关联到NSApplication实例上。当你移除这个配置后,系统失去了默认的启动入口指引,@NSApplicationMain的语法糖直接失效——它没办法自动把你的AppDelegate绑定到应用上,自然applicationDidFinishLaunching这些委托方法不会被触发,应用也没有界面。
怎么解决?
你需要手动接管应用的启动流程,分两步就能搞定:
创建自定义的main入口文件
在项目里新建一个main.swift文件(如果已有就直接修改),替换掉@NSApplicationMain的自动生成逻辑:import Cocoa // 初始化应用实例 let app = NSApplication.shared // 实例化你的AppDelegate let appDelegate = AppDelegate() // 手动绑定委托 app.delegate = appDelegate // 启动应用事件循环 NSApp.run()注意:要把原来AppDelegate类上的
@NSApplicationMain标记删掉!在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) // 显示窗口 } }最后检查编译设置
确保项目的"Build Settings"里,"Main Interface"选项是空的(因为我们已经完全抛弃storyboard了),同时main.swift已经被包含在项目的编译源文件中。
做完这些操作后,重新构建运行,你会看到OK的调试输出,同时自定义的主窗口也会正常显示了。
内容的提问来源于stack exchange,提问作者Efim Plotnikov

