我有以下单个代码文件,在其中我尝试在不使用nibs或Xcode的情况下,以尽可能少的代码创建一个具有基本功能的Cocoa应用程序。我的大部分信息来自以下博客文章,其中发布了等效的Objective-C代码:(http://www.cocoawithlove.com/2010/09/minimalist-cocoa-programming.html)。我所做的唯一主要更改是用于管理窗口的 AppDelegate 类,这通常是在 Xcode 项目中完成的。
import Cocoa
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow
override init() {
self.window = NSWindow()
self.window.setFrame(NSRect(x: 0, y: 0, width: 1280, height: 720), display: true)
self.window.collectionBehavior = .FullScreenPrimary
self.window.styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask
self.window.title = "Main Window"
}
func applicationDidFinishLaunching(notification: NSNotification) {
window.makeKeyAndOrderFront(self)
}
func applicationShouldTerminateAfterLastWindowClosed(sender: NSApplication) -> Bool {
return true
}
}
autoreleasepool {
NSApplication.sharedApplication()
NSApp.setActivationPolicy(.Regular)
let delegate = AppDelegate()
NSApp.delegate = delegate
let mainMenu = NSMenu()
NSApp.mainMenu = mainMenu
let applicationMenuItem = NSMenuItem()
mainMenu.addItem(applicationMenuItem)
let applicationMenu = NSMenu()
let quitMenuItem = NSMenuItem()
quitMenuItem.action = #selector(NSApp.terminate(_:))
quitMenuItem.keyEquivalent = "q"
quitMenuItem.title = "Quit Cocoa Window Test"
applicationMenu.addItem(quitMenuItem)
applicationMenuItem.submenu = applicationMenu
NSApp.activateIgnoringOtherApps(true)
NSApp.run()
}
我使用以下命令从终端成功编译:
swiftc -o bin/CocoaWindowTest -g -framework Cocoa ./src/main.swift
菜单上出现了我的问题。尽管 ⌘Q 键盘快捷键按预期工作,但我创建的应用程序菜单无法打开,并且我无法弄清楚原因。
NSApp.run()
后调用NSApp.activateIgnoringOtherApps()
来解决问题。总而言之,我的代码的主要部分现在如下所示:
autoreleasepool {
NSApplication.sharedApplication()
NSApp.setActivationPolicy(.Regular)
let delegate = AppDelegate()
NSApp.delegate = delegate
// Menu setup here...
NSApp.run()
NSApp.activateIgnoringOtherApps(true)
}
您应该使用 mainMenu.setSubmenu(applicationMenu, forItem:applicationMenuItem)
来设置子菜单。带有子菜单的项目有一个特殊操作,submenuAction(_:)
分配,负责实际显示子菜单。上述方法正确分配了该操作(并且比自己设置更可取)。
对于它的价值,在菜单完成之前,我不会设置NSApp.mainMenu
。