如何为Mac创建菜单栏应用程序


175

编辑:这是一个很好的现成的菜单栏的应用程序在这里GitHub的源)通过这个答案


我想知道如何制作菜单栏应用程序,这样做的要求是什么?

我看到菜单栏的一个简单应用程序是使用浏览器打开链接,我想创建类似的东西。

在此处输入图片说明

这是我喜欢制作的应用程序。


4
这是一个简单的教程
NSRover

Answers:


133

NSStatusItem是您要寻找的。还将字符串值1的LSUIElement添加到Info.plist,以将其从Dock中隐藏。


14
mactech.com/articles/mactech/Vol.22/22.02/Menulet-这是示例代码,并带有一些说明。
SteamTrout 2010年

2
:您可以检查出我的GitHug项目之一为例github.com/nippysaurus/WeatherRock/blob/master/...
Nippysaurus

3
我实现了SteamTrout链接中描述的示例,并将其放在github上。它在这里:github.com/wanderingstan/IPMenuletExample
Stan James

你好蒸汽鳟鱼,感谢您的帮助......但如何才能始终保持我们的应用程序的快捷菜单栏,直到用户卸载应用程序...任何帮助.... stackoverflow.com/questions/23605687/...
VSN

66

我发现Codebox的Popup是一个很好的起点。在Github上分叉的时机已经成熟

在此处输入图片说明

尽管效果很好,但他们确实在自己的网站上注明了...

PS在Lion中,Apple为iOS中的弹出窗口添加了新类。因此,在OS X 10.7发布之后,您最好在可能的情况下依赖本机Cocoa类。在其他情况下,弹出项目仍应可用。


3
在任何情况下都不是这样。NSPopover具有严重的局限性:文本字段/视图不能成为第一响应者,因此您不能输入文本。
Christian Kienle

@ChristianKienle,所以您仍然建议从OS X版本> 10.7的Popup应用程序开始吗?
fatuhoku 2013年

是。NSPopover +状态项在10.7和10.8中有严格的限制。例如,上面的屏幕截图显示了搜索字段。通过使用NSPopover,您无法与搜索字段正确交互。
Christian Kienle 2013年

1
为什么Codebox的Popup示例具有如此复杂的BackgroundPanel?
rbp

13

位栏GitHub上的一个应用程序,可以“在Mac OS X菜单栏中放入任何内容”。

它运行shell或其他可执行脚本(它称为 插件-请参见插件repo中的许多示例),并将结果显示在菜单栏中。您可以编写自己的插件并使其运行,只需将其添加到“插件文件夹”中即可。除了显示信息外,它还可以从您定义的插件菜单以交互方式运行预定义的bash脚本。

自从我第一次发布此答案以来,它的受欢迎程度一直很高 激增了(目前有52位贡献者),现在甚至还有一个可分发的版本,您可以使用该版本打包自己的插件。

一个非常简单的(非交互式)示例来显示实时比特币价格:

在此处输入图片说明


4
感谢cwd改善了我的答案,我的回答很差
MatzFan 2015年


2

FlyCut是另一个很好的开源应用程序。(麻省理工学院许可。)也非常方便,我一天使用几次。

以下是一些看起来可能相关的代码:

    // Flycut/AppController.h
    IBOutlet NSMenu *jcMenu;

    // Flycut/AppController.m
    statusItem = [[[NSStatusBar systemStatusBar]
            statusItemWithLength:NSVariableStatusItemLength] retain];
    [statusItem setHighlightMode:YES];

    if ( [[DBUserDefaults standardUserDefaults] integerForKey:@"menuIcon"] == 1 ) {
        [statusItem setTitle:[NSString stringWithFormat:@"%C",0x2704]]; 
    } else if ( [[DBUserDefaults standardUserDefaults] integerForKey:@"menuIcon"] == 2 ) {
        [statusItem setTitle:[NSString stringWithFormat:@"%C",0x2702]]; 
    } else {
        [statusItem setImage:[NSImage imageNamed:@"com.generalarcade.flycut.16.png"]];
    }
    [statusItem setMenu:jcMenu];
    [statusItem setEnabled:YES];

嗨,funroll,我想将此快捷方式始终保留在菜单栏中,例如mac中的默认valume控件是否可以通过编程进行编程...请帮助我!
VSN 2014年

@VSN StackOverflow注释不是寻求此类帮助的好地方。我建议阅读如何提出一个好问题
funroll

我问了一个新问题
VSN 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.