gpt4 book ai didi

objective-c - Cocoa:NSUserNotification出现在NSPopover后面

转载 作者:行者123 更新时间:2023-12-03 16:15:36 24 4
gpt4 key购买 nike

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

}

感谢您的帮助。

最佳答案

您想要调整window.level

通知使用的是 18 级,因此只要您的级别较低,就不会出现此问题。

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

  • .正常 = 0
  • . float = 3
  • .submenu = 3
  • .tornOffMenu = 3

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

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

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

func popoverDidShow(_ notification: Notification)

或者直接使用NSPopoverDidShowNotification监听通知。

已在 macOS 10.15 上进行测试

关于objective-c - Cocoa:NSUserNotification出现在NSPopover后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25476604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com