Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos OSX状态菜单在Swift中不工作_Macos_Cocoa_Swift - Fatal编程技术网

Macos OSX状态菜单在Swift中不工作

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

我试图用swift在状态栏中添加一个简单的状态菜单,但它不会显示

对于objective-c,这起到了作用:


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
    }

}