首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从‘`main()’创建的‘NSStatusItem`没有显示在系统状态栏上

从‘`main()’创建的‘NSStatusItem`没有显示在系统状态栏上
EN

Stack Overflow用户
提问于 2020-03-03 19:47:20
回答 3查看 717关注 0票数 0

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

代码语言:javascript
复制
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)

下面是我的应用程序的一个最小可重现性示例:

代码语言:javascript
复制
#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;
}

我编译并运行了如下示例:

代码语言:javascript
复制
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没有明显的区别。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-03-04 18:15:20

这不是您在main()中可以做的事情。

除了极端异常的情况外,您永远不应该修改应用程序模板附带的main(),而且它必须调用NSApplicationMain()

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    // start the application
    return NSApplicationMain(argc, (const char **) argv);
}

Cocoa框架在调用NSApplicationMain()之前不会被初始化,并且通常在那时之前是不可用的。

这种设置应该在applicationWillFinishLaunchingapplicationDidFinishLaunching中完成。

更新

最初的海报没有使用Xcode,并且愿意独自勇敢地面对荒野。;)

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

有一些勇敢的人,他们勇敢地面对这片土地,你可以在Creating a Cocoa application without NIB files上读到它。

票数 1
EN

Stack Overflow用户

发布于 2020-04-28 00:06:58

这是如何将状态栏项添加到命令行app mac osx cocoa中。

把apodidae的答案改编成Swift。只需将其放入main.swift文件:

代码语言:javascript
复制
let app = NSApplication()
let statusItem = NSStatusBar.system.statusItem(withLength: -1)
statusItem.button!.title = "Hello, world!"
app.run()

我不明白NSReleasePool的更详细的细节,包括阿波迪,但它的工作,我没有这一点。

票数 3
EN

Stack Overflow用户

发布于 2020-03-15 16:43:35

代码语言:javascript
复制
#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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60514459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档