0

我正在尝试制作一个简单的 macOS Cocoa 应用程序NSStatusItem,用于在系统状态栏上创建一个可点击的图标。但是,当我启动我的应用程序时,我收到了这个警告并且图标没有出现:

2020-03-03 14:43:11.564 Mocha_bug_example[936:39572] CGSGetActiveMenuBarDrawingStyle((CGSConnectionID)[NSApp contextID], &sCachedMenuBarDrawingStyle) returned error 268435459 on line 46 in NSStatusBarMenuBarDrawingStyle _NSStatusBarGetCachedMenuBarDrawingStyle(void)

这是我的应用程序的最小可重现示例:

#import <AppKit/AppKit.h>

NSStatusItem* statusItem;

int main (int argc, char* argv[]) {
        statusItem = [NSStatusBar.systemStatusBar statusItemWithLength: -1];
        statusItem.button.title = @"foobar";
        statusItem.visible = YES;

        [NSApplication.sharedApplication run];
        return 0;
}

我编译并运行了这样的示例:

MacBook-Air-5:Mocha ericreed$ clang -o Mocha_bug_example -framework AppKit -fobjc-arc Mocha_bug_example.m
MacBook-Air-5:Mocha ericreed$ ./Mocha_bug_example
2020-03-03 14:43:11.564 Mocha_bug_example[936:39572] CGSGetActiveMenuBarDrawingStyle((CGSConnectionID)[NSApp contextID], &sCachedMenuBarDrawingStyle) returned error 268435459 on line 46 in NSStatusBarMenuBarDrawingStyle _NSStatusBarGetCachedMenuBarDrawingStyle(void)
[Application hung until I pressed Ctrl+C]
^C
MacBook-Air-5:Mocha ericreed$ 

注意:禁用自动引用计数并[statusItem release];在调用后run添加这个类似的问题建议没有明显的区别。

4

3 回答 3

3

这是如何将状态栏项目添加到命令行应用程序 mac osx cocoa

改编 apodidae 对 Swift 的回答。只需将其放在 main.swift 文件中:

let app = NSApplication()
let statusItem = NSStatusBar.system.statusItem(withLength: -1)
statusItem.button!.title = "PENIS!"
app.run()

我不了解 NSReleasePool 包括 apodidae 在内的更详细的细节,但没有它它对我有用。

于 2020-04-28T00:06:58.840 回答
2
#import <Cocoa/Cocoa.h>

int main(){
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
 NSApplication *application = [NSApplication sharedApplication];
 NSStatusItem* statusItem;
 statusItem = [NSStatusBar.systemStatusBar statusItemWithLength: -1];
 statusItem.button.title = @"foobar";
 statusItem.visible = YES;
 [application run];
 [pool drain];
 return 0;
}

使用名称“statusBar_SO.m”保存文件

从终端编译: clang statusBar_SO.m -framework Cocoa -o statusBar && ./statusBar

于 2020-03-15T16:43:35.360 回答
1

这不是你可以做的事情main()

不寻常的情况外,您不应该修改main()应用程序模板附带的,它必须调用NSApplicationMain()

int main(int argc, char *argv[])
{
    // start the application
    return NSApplicationMain(argc, (const char **) argv);
}

Cocoa 框架在您调用之前不会被初始化,NSApplicationMain()并且在此之前通常无法使用。

这种设置应该在applicationWillFinishLaunchingor中完成applicationDidFinishLaunching

更新

原贴使用Xcode,愿意独自闯荡荒野。;)

这也意味着他们的应用程序包将没有通常会创建和连接应用程序委托对象、主菜单等的主 NIB 文件。

有勇敢的人勇敢地闯入了这个领域,您可以在创建没有 NIB 文件的 Cocoa 应用程序中了解它。

于 2020-03-04T18:15:20.673 回答