Macos OSX状态菜单在Swift中不工作
我试图用swift在状态栏中添加一个简单的状态菜单,但它不会显示 对于objective-c,这起到了作用:Macos OSX状态菜单在Swift中不工作,macos,cocoa,swift,Macos,Cocoa,Swift,我试图用swift在状态栏中添加一个简单的状态菜单,但它不会显示 对于objective-c,这起到了作用: AppDelegate.h @interface AppDelegate : NSObject <NSApplicationDelegate> { IBOutlet NSMenu *statusMenu; NSStatusItem * statusItem; } @end 但如果我尝试在swift中做基本相同的事情,它不会做任何事情 class App
AppDelegate.h
@interface AppDelegate : NSObject <NSApplicationDelegate> {
IBOutlet NSMenu *statusMenu;
NSStatusItem * statusItem;
}
@end
但如果我尝试在swift中做基本相同的事情,它不会做任何事情
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet var statusMenu: NSMenu;
func applicationDidFinishLaunching(aNotification: NSNotification?) {
let bar = NSStatusBar.systemStatusBar()
let statusItem = bar.statusItemWithLength(CGFloat(NSVariableStatusItemLength))
statusItem.title = "Status Menu"
statusItem.menu = statusMenu
statusItem.highlightMode = true
}
}
没有错误,只是没有任何作用。调用函数ApplicationIDFinishLaunching
,因为函数中的println()创建输出
有人知道我做错了什么吗?这里的问题是
statusItem
在applicationdFinishLaunching
完成执行后,会超出范围,从而释放对象。在Objective-C代码中不是这种情况,因为statusItem
变量是在类级别声明的
这将使您的Swift代码正常工作:
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet var statusMenu: NSMenu;
var statusItem: NSStatusItem?;
func applicationDidFinishLaunching(aNotification: NSNotification?) {
let bar = NSStatusBar.systemStatusBar()
statusItem = bar.statusItemWithLength(CGFloat(NSVariableStatusItemLength))
statusItem!.title = "Status Menu"
statusItem!.menu = statusMenu
statusItem!.highlightMode = true
}
}
非常感谢。这似乎有道理。今晚回家后,我会尝试一下。@hildende作为一个侧节点,我上传了一个用Swift编写的菜单栏应用程序,您可能会发现它对Github很有帮助(如果只是一个Swift参考):它就像一个符咒:)也非常感谢您的Github链接。我对OSX编程相当陌生,两周前才拿到我的第一本MacBook,所以欢迎所有帮助:)当我尝试使用Xcode6-Beta5构建时,它会说“找不到匹配的签名身份”,我想这意味着自从你制作了应用程序后,Xcode不会让我构建以防止盗版和修改源代码。所以一个构建将是伟大的,这只是代码签名的开始。。。要禁用或设置您自己的签名身份,请转到项目设置,搜索“代码签名”并将“代码签名身份”更改为“不要代码签名”或您自己的身份。关于“覆盖”关键字,我有一个简单的问题:在书中,它说:“意外覆盖可能导致意外行为,在编译代码时,没有override关键字的任何重写都会被诊断为错误。“但是您在ApplicationIDFinishLaunching时忽略了它,尽管此func重写了NSApplicationDelegate中的func,对吗?那么为什么这样做有效呢?
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet var statusMenu: NSMenu;
var statusItem: NSStatusItem?;
func applicationDidFinishLaunching(aNotification: NSNotification?) {
let bar = NSStatusBar.systemStatusBar()
statusItem = bar.statusItemWithLength(CGFloat(NSVariableStatusItemLength))
statusItem!.title = "Status Menu"
statusItem!.menu = statusMenu
statusItem!.highlightMode = true
}
}