块内的模态NSAlert未显示

时间:2012-10-02 15:48:39

标签: objective-c cocoa block nsalert

在我的基于文档的应用程序中,我已经覆盖了方法openDocument:在我的NSDocumentcontroller的子类中,以便我可以显示自己的openPanel。我将所选的URL传递给方法openDocumentWithContentsOfURL:display:completionHandler:。我使用此代码进行调用:

[self openDocumentWithContentsOfURL:[chosenFiles objectAtIndex:i] display:YES completionHandler:^(NSDocument *document, BOOL documentWasAlreadyOpen, NSError *error) {

    if (document == nil)
    {
        NSAlert* alert = [NSAlert alertWithError:error];
        [alert runModal];
    }

}];

因此,如果将nil作为对文档的引用返回,我想显示传递的错误。问题是,按下打开面板中的“打开”按钮后,程序只是“冻结”。然后我需要使用Xcode中的“停止”按钮手动停止程序。但是,没有旋转沙滩球出现。如果我对“[alert runModal]”行进行注释,程序不会再冻结,但当然不会显示警告。

现在奇怪的是:代码有时 。如果我从Xcode切换到我的浏览器并返回并再次运行程序,它有时会完美无缺地运行并显示错误。一段时间后它再次停止工作。这是不可预测的,但大多数时候它不起作用。

这对我来说听起来像是一场竞赛。它当然与块有关?但是我做错了什么?

1 个答案:

答案 0 :(得分:1)

将我的评论转换为答案:

主线程上的runModel。

[alert performSelectorOnMainThread:@selector(runModal) withObject:nil waitUntilDone:NO]; 

我认为需要在主线程上调用runModel,因为它是AppKit框架的一部分,并且它可能会触发UI图形。我相信所有对AppKit框架或任何操纵图形的方法的调用都需要在主线程上。