检查 NSAlert 当前是否显示
Check if NSAlert is currently showing up
我正在使用 NSAlert
在我的应用程序的主屏幕上显示错误消息。
基本上,NSAlert
是我的主视图控制器
的 属性
class ViewController: NSViewController {
var alert: NSAlert?
...
}
当我收到一些通知时,我会显示一些消息
func operationDidFail(notification: NSNotification)
{
dispatch_async(dispatch_get_main_queue(), {
self.alert = NSAlert()
self.alert.messageText = "Operation failed"
alert.runModal();
})
}
现在,如果我收到多个通知,每个通知都会显示警报。我的意思是,它与第一条消息一起出现,我单击 "Ok",它消失,然后与第二条消息一起再次出现,等等...这是正常行为。
我想要实现的是避免这一系列的错误消息。其实我只关心第一个。
有没有办法知道我的警报视图当前是否正在显示?
像 alert.isVisible
和 iOS 的 UIAlertView
?
您可以尝试
而不是 运行 模式
- beginSheetModalForWindow:completionHandler:
在完成处理程序中将警报 属性 设置为 nil。
并且仅在警报 属性 为零时才显示警报(这将是在解除警报后的第一次)。
编辑:我没有看到文档对您要查找的任何类型的标志有任何说明。
根据您的代码,我怀疑通知是在后台线程中触发的。在这种情况下,任何检查警报现在是否可见的检查都无济于事。在第一个块完成之前,您的代码不会开始执行后续块,因为 runModal
方法将阻塞,运行 NSRunLoop
在模态模式下。
要解决你的问题,你可以引入 atomic bool 属性 并在 dispatch_async
之前检查它。
Objective-C解法:
- (void)operationDidFail:(NSNotification *)note {
if (!self.alertDispatched) {
self.alertDispatched = YES;
dispatch_async(dispatch_get_main_queue(), ^{
self.alert = [NSAlert new];
self.alert.messageText = @"Operation failed";
[self.alert runModal];
self.alertDispatched = NO;
});
}
}
相同代码使用 Swift:
func operationDidFail(notification: NSNotification)
{
if !self.alertDispatched {
self.alertDispatched = true
dispatch_async(dispatch_get_main_queue(), {
self.alert = NSAlert()
self.alert.messageText = "Operation failed"
self.alert.runModal();
self.alertDispatched = false
})
}
}
我正在使用 NSAlert
在我的应用程序的主屏幕上显示错误消息。
基本上,NSAlert
是我的主视图控制器
class ViewController: NSViewController {
var alert: NSAlert?
...
}
当我收到一些通知时,我会显示一些消息
func operationDidFail(notification: NSNotification)
{
dispatch_async(dispatch_get_main_queue(), {
self.alert = NSAlert()
self.alert.messageText = "Operation failed"
alert.runModal();
})
}
现在,如果我收到多个通知,每个通知都会显示警报。我的意思是,它与第一条消息一起出现,我单击 "Ok",它消失,然后与第二条消息一起再次出现,等等...这是正常行为。
我想要实现的是避免这一系列的错误消息。其实我只关心第一个。
有没有办法知道我的警报视图当前是否正在显示?
像 alert.isVisible
和 iOS 的 UIAlertView
?
您可以尝试
而不是 运行 模式- beginSheetModalForWindow:completionHandler:
在完成处理程序中将警报 属性 设置为 nil。 并且仅在警报 属性 为零时才显示警报(这将是在解除警报后的第一次)。 编辑:我没有看到文档对您要查找的任何类型的标志有任何说明。
根据您的代码,我怀疑通知是在后台线程中触发的。在这种情况下,任何检查警报现在是否可见的检查都无济于事。在第一个块完成之前,您的代码不会开始执行后续块,因为 runModal
方法将阻塞,运行 NSRunLoop
在模态模式下。
要解决你的问题,你可以引入 atomic bool 属性 并在 dispatch_async
之前检查它。
Objective-C解法:
- (void)operationDidFail:(NSNotification *)note {
if (!self.alertDispatched) {
self.alertDispatched = YES;
dispatch_async(dispatch_get_main_queue(), ^{
self.alert = [NSAlert new];
self.alert.messageText = @"Operation failed";
[self.alert runModal];
self.alertDispatched = NO;
});
}
}
相同代码使用 Swift:
func operationDidFail(notification: NSNotification)
{
if !self.alertDispatched {
self.alertDispatched = true
dispatch_async(dispatch_get_main_queue(), {
self.alert = NSAlert()
self.alert.messageText = "Operation failed"
self.alert.runModal();
self.alertDispatched = false
})
}
}