【问题标题】:Cocoa: NSUserNotification appears behind NSPopoverCocoa:NSUserNotification 出现在 NSPopover 后面
【发布时间】: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


【解决方案1】:

你想调整window.level

一个通知是用18级的,所以只要你的等级低一点就不会出现这个问题。

你可以使用这些默认的NSWindow.Level

  • .normal = 0
  • .floating = 3
  • .submenu = 3
  • .tornOffMenu = 3

或自定义级别NSWindow.Level(rawValue: 17)

需要注意的重要一点是,您应该在弹出框显示期间或之后设置窗口级别。否则您的设置将被重置。

您可以从popover.delegate 使用该函数来执行此操作,

func popoverDidShow(_ notification: Notification)

或者直接用NSPopoverDidShowNotification收听通知。

已在 macOS 10.15 上测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多