线程1运行模态警报:
- (void)didEndSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
{
[sheet orderOut:self];
};
-(void)newAlert
{
currentAlert=[NSAlert alertWithMessageText:@"Switch drives!" defaultButton:@"Cancel sync" alternateButton:nil otherButton:nil informativeTextWithFormat:@"Please switch disks: %@",reason,nil];
[currentAlert setDelegate:self];
[currentAlert beginSheetModalForWindow:self.window completionHandler:^(NSInteger returnCode)
{
mustStop=TRUE;
}];
}
在其他地方,在另一个线程上我想解除警报,但这不起作用:
[NSApp endSheet:[self window]];
它不起作用。
答案 0 :(得分:5)
您无法在后台线程上执行GUI操作。你必须在主线程上执行它们。所以,你可以这样做:
dispatch_async(dispatch_get_main_queue(), ^{
[NSApp endSheet:self.window];
});
但从技术上讲,您应该在NSWindow
上使用新的工作表方法。所以,你应该这样做:
dispatch_async(dispatch_get_main_queue(), ^{
[self.window endSheet:currentAlert.window];
});
当然,这意味着您需要跟踪-newAlert
方法之外的警报。 (如果您没有跟踪警报,我想您可以使用self.window.attachedSheet
,尽管可能存在竞争条件,其中后台线程取消与警报不同的工作表。)
此外,使用-didEndSheet:returnCode:contextInfo:
运行提醒时,不会使用方法-beginSheetModalForWindow:completionHandler:
。