4

我不知道从哪里开始尝试解决这个问题,但也许有人可以为我指明正确的方向。我有一个状态项应用程序,单击时会显示一个弹出框,一些用户交互会产生一个 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];
}

}

谢谢您的帮助。

4

1 回答 1

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 上进行了测试

于 2020-03-31T09:42:55.077 回答