gpt4 book ai didi

objective-c - 如何以编程方式关闭窗口的 NSAlert 运行模式

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

线程 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]];

它不起作用。

最佳答案

您无法在后台线程上执行 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 ,尽管后台线程取消与警报不同的工作表时可能存在竞争条件。)

此外,当使用 -beginSheetModalForWindow:completionHandler: 运行警报时,不会使用方法 -didEndSheet:returnCode:contextInfo:

关于objective-c - 如何以编程方式关闭窗口的 NSAlert 运行模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32173037/

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