OSX状态菜单在Swift中不工作 [英] OSX status menu not working in Swift
问题描述
使用objective-c这个工作:
我试图在swift状态栏中添加一个简单的状态菜单,但不会显示。AppDelegate.h
@ interface AppDelegate:NSObject< NSApplicationDelegate> {
IBOutlet NSMenu * statusMenu;
NSStatusItem * statusItem;
}
@end
AppDelegate.m
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
[statusItem setMenu:statusMenu];
[statusItem setTitle:@Status Menu];
[statusItem setHighlightMode:YES];
}
@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 =状态菜单
statusItem.menu = statusMenu
statusItem.highlightMode = true
}
}
没有错误,它只是不做任何事情。函数 applicationDidFinishLaunching
被调用,因为println()里面创建输出。
这里的问题是 statusItem
在 applicationDidFinishLaunching
完成执行后会释放对象,因此超出范围。这不是你的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
}
}
I tried to add a simple status menu to the status bar with swift but it will not be shown.
with objective-c this worked:
AppDelegate.h
@interface AppDelegate : NSObject <NSApplicationDelegate> {
IBOutlet NSMenu *statusMenu;
NSStatusItem * statusItem;
}
@end
AppDelegate.m
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
[statusItem setMenu:statusMenu];
[statusItem setTitle:@"Status Menu"];
[statusItem setHighlightMode:YES];
}
@end
But if i try to do basically the same thing in swift it doesn't do anything.
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
}
}
There's no error, it just doesn't do anything. the function applicationDidFinishLaunching
is called since a println() inside it creates output.
Does anyone have an idea what I'm doing wrong here?
The problem here is that statusItem
is going out of scope after applicationDidFinishLaunching
finishes execution which in turn releases the object. This is not the case in your Objective-C code because the statusItem
variable is declared at class level.
This should make your Swift code work:
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
}
}
这篇关于OSX状态菜单在Swift中不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!