Con*_*cob 4 cocoa nsstatusitem nspopover
我正在玩一个想法,基本上我想要一个带有NSPopoverController的NSStatusItem.我读到了人们遇到的所有问题,但我只是想尝试一下.现在还有一个干净的方法吗?我见过的所有版本都至少有一年的版本和suuuuper hacky.
到目前为止这是我的方法,但如果我在状态栏中点击我的应用程序没有任何反应......
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
//[self.statusItem setView:view];
[self.statusItem setTitle:@"Test"];
[self.statusItem setHighlightMode:YES];
[self.statusItem setAction:@selector(activatePopover:)];
}
-(IBAction)activatePopover:(id)sender
{
BOOL isEnabled = NO;
if (isEnabled) {
[self.popover showRelativeToRect:NSMakeRect(0, 0, 50, 50) ofView:statusItem.view preferredEdge:NSMinYEdge];
} else {
[self.popover close];
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法如何运行?
谢谢
如果不在状态项上使用自定义视图,则无法使用此功能.如果您没有设置自定义视图,则该view属性将为空(它仅返回自定义视图,而不是NSStatusItem您刚刚使用时在内部使用的任何视图setTitle).
不幸的是,根据Apple的文档,如果你想使用,你需要提供自己的视图并自己处理点击NSPopover.
我还没有看到一个包含正确处理的完整示例(状态项的默认实现相当多,您必须手动完成),并修复了popover wonkynesses:
NSPopover,默认情况下,不会成为关键窗口(某些控件不起作用),除非你覆盖canBecomeKeyWindowNSPopover的窗口popUpStatusItemMenu使用空菜单调用以正确聚焦状态项)drawStatusBarBackgroundInRectNSRunningApplication.currentApplication.activateWithOptions,以确保您的状态项目的所有窗口变为有效(否则你的酥料饼会,不稳定,不能键盘输入的接收器)NSEvent.addGlobalMonitorForEventsMatchingMask(内置的解雇机制popovers随附状态项无效)NSStatusBar.systemStatusBar.removeStatusItem我希望很快就能有一篇关于这篇文章的博客文章(注意:我使用的是RubyMotion,而不是Objective-C),它解释了所有这些问题,并希望为创建menulet提供更简单的基础.如果我写这篇文章,我会更新这条评论.