【发布时间】:2014-10-18 01:18:08
【问题描述】:
我什至不知道从哪里开始尝试解决此问题,但也许有人可以为我指明正确的方向。我有一个状态项应用程序,单击时会显示一个弹出框,一些用户交互会产生一个 NSUserNotification 来警告/通知更改或错误。但是当通知出现时,它会显示在弹出框的后面,因此如果它们覆盖,用户将无法阅读它所说的内容。
有没有办法强制通知出现在弹出框的前面?喜欢把通知放在前面。
编辑:这是一张图片,显示在用户输入错误后隐藏在弹出框后面的部分通知。我真的不想隐藏弹出框来显示错误通知。
我已经尝试过 makeKeyAndOrderFront、activateIgnoringOtherApps 等你在窗口上使用的东西,但它们都不适用于 NSUserNotification,所以它不起作用。
编辑 2:我应该注意,为了让弹出框在调用时出现在所有内容的前面,我在弹出框上使用了 activateIgnoringOtherApps 和 becomeFirstResponder,但即使摆脱它仍然会在弹出框后面显示通知。
编辑 3:弹出框相对于状态栏中的状态项显示,使用
[[self popover] showRelativeToRect:statusItem.view.bounds ofView:statusItem.view preferredEdge:NSMaxYEdge];
单击时,状态项会调用执行此操作的方法:
- (void)openPopover:(id)sender {
if (![_popover isShown] | (_popoverIsClosing)) {
[_preferencesWindow close];
[NSApp activateIgnoringOtherApps:YES];
[_popover becomeFirstResponder];
[statusItemView setHighlighted:YES];
[[self popover] showRelativeToRect:statusItem.view.bounds ofView:statusItem.view preferredEdge:NSMaxYEdge];
[self performSelector:@selector(defaultTextField)];
NSLog(@"popover opened");
} else {
[_preferencesWindow close];
[NSApp activateIgnoringOtherApps:NO];
NSLog(@"popover closed");
[_popover close];
[_popover resignFirstResponder];
[[NSApplication sharedApplication] hide: self];
[statusItemView setHighlighted:NO];
}
}
感谢您的帮助。
【问题讨论】:
-
我猜这可能与弹出窗口中的窗口级别有关,您能否分享更多有关您如何显示该弹出窗口的信息?
-
Edit 3 有更多信息
-
您正在将
NSPopover定位在菜单栏中的某个项目上,该项目的级别高于通知。 -
[[[_popover.contentViewController view] window] setLevel:level]怎么样?不过我还没有测试过。 -
@rintaro 成功了!把它写在一个答案中,我会选择它作为答案。谢谢!
标签: objective-c cocoa nspopover nsusernotification