OSX状态菜单在Swift中不起作用

时间:2014-06-05 20:14:17

标签: macos cocoa swift

我尝试使用swift向状态栏添加一个简单的状态菜单,但不会显示。

目标-c这有效:


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 = "Status Menu"
        statusItem.menu = statusMenu
        statusItem.highlightMode = true
    }

}

没有错误,它只是没有做任何事情。调用函数applicationDidFinishLaunching,因为其中的println()会创建输出。

有没有人知道我在这里做错了什么?

1 个答案:

答案 0 :(得分:13)

这里的问题是statusItemapplicationDidFinishLaunching完成执行后超出了范围,而statusItem又释放了对象。在Objective-C代码中并非如此,因为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 } } 变量是在类级别声明的。

这应该使你的Swift代码工作:

{{1}}