OSX状态菜单在Swift中不工作 [英] OSX status menu not working in Swift

查看:115
本文介绍了OSX状态菜单在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆