我在玩弄一个想法,基本上我想要一个带NSPopoverController的NSStatusItem。我读过人们遇到的所有问题,但我只想试一试。现在有没有一种干净利落的方法呢?我见过的所有版本都至少有一年的历史,而且都很新潮。
到目前为止,这是我的方法,但如果我在状态栏中单击我的应用程序,什么也不会发生……
- (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];
}
}有什么办法让它运行起来吗?
谢谢
发布于 2014-05-04 20:31:24
如果不在状态项上使用自定义视图,这将不起作用。如果您不设置自定义视图,则view属性将为空(它只返回自定义视图,而不是您仅使用setTitle时NSStatusItem在内部使用的任何视图)。
不幸的是,根据苹果公司的文档,如果你想使用NSPopover,你需要提供自己的视图并自己处理点击。
我还没有看到一个完整的例子来正确地处理这个问题(状态项的默认实现做了相当多的工作,您必须手动完成所有这些工作),并且还修复了popover wonkynesses:
默认情况下,
NSPopover,不会成为关键窗口(某些控件将不起作用),除非您覆盖NSPopover的windowpopUpStatusItemMenu以正确聚焦您的状态,并使用drawStatusBarBackgroundInRectNSRunningApplication.currentApplication.activateWithOptions以确保状态项的所有窗口都变为活动状态(否则,您的弹出窗口将不正常地,不是键盘和带NSStatusBar.systemStatusBar.removeStatusItem的NSPopover的接收器(内置的解除机制弹出窗口不适用于status items)
NSStatusBar.systemStatusBar.removeStatusItem
的NSPopover on NSEvent.addGlobalMonitorForEventsMatchingMask
我希望在不久的将来有一篇关于这方面的博客文章(注意:我使用的是RubyMotion,而不是Objective-C),它解释了所有这些问题,并希望为创建menulets提供一个更容易的基础。如果我写了那篇文章,我会更新这条评论。
发布于 2015-10-31 23:23:15
代码:
-(void)initializeStatusBarItem
{
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
NSImage* image = [NSImage imageNamed:@"image"];
// [image setTemplate:YES];
self.statusItem.button.image = image;
self.statusItem.highlightMode = NO;
self.statusItem.button.action = @selector(statusBarItemDidClick:);
}
- (void)statusBarItemDidClick:(NSStatusBarButton *)sender{
MainViewController *mainView = [[MainViewController alloc] init];
self.popoverView = [[NSPopover alloc] init];
[self.popoverView setContentViewController:mainView];
self.popoverView.contentSize = CGSizeMake(300, 400);
self.popoverView.behavior = NSPopoverBehaviorTransient;
[self.popoverView showRelativeToRect:sender.bounds ofView:sender preferredEdge:NSMaxYEdge];
}https://stackoverflow.com/questions/23354488
复制相似问题