我正在尝试制作一个简单的macOS可可应用程序,使用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之后禁用自动引用计数和添加this similar question没有明显的区别。
发布于 2020-03-04 18:15:20
这不是您在main()中可以做的事情。
除了极端异常的情况外,您永远不应该修改应用程序模板附带的main(),而且它必须调用NSApplicationMain()。
int main(int argc, char *argv[])
{
// start the application
return NSApplicationMain(argc, (const char **) argv);
}Cocoa框架在调用NSApplicationMain()之前不会被初始化,并且通常在那时之前是不可用的。
这种设置应该在applicationWillFinishLaunching或applicationDidFinishLaunching中完成。
更新
最初的海报没有使用Xcode,并且愿意独自勇敢地面对荒野。;)
这还意味着它们的应用程序包将没有一个主NIB文件,该文件通常会创建和连接应用程序委托对象、主菜单等。
有一些勇敢的人,他们勇敢地面对这片土地,你可以在Creating a Cocoa application without NIB files上读到它。
发布于 2020-04-28 00:06:58
这是如何将状态栏项添加到命令行app mac osx cocoa中。
把apodidae的答案改编成Swift。只需将其放入main.swift文件:
let app = NSApplication()
let statusItem = NSStatusBar.system.statusItem(withLength: -1)
statusItem.button!.title = "Hello, world!"
app.run()我不明白NSReleasePool的更详细的细节,包括阿波迪,但它的工作,我没有这一点。
发布于 2020-03-15 16:43:35
#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
https://stackoverflow.com/questions/60514459
复制相似问题