NSOpenPanel不会自动关闭

时间:2014-05-07 03:05:46

标签: objective-c cocoa nsopenpanel

我不明白为什么当我点击OK按钮时面板不会立即关闭。

if (NSOKButton == [uploadPanel runModal]) {
    for (int i = 0; i < 10000; i++) {
        NSLog(@"%d",i);
    }
}

相反,只有在范围内的所有陈述都被激活之前,它才会关闭。

当我将代码改为这样的代码时,结果变成了同样的结果,这很奇怪:

if (NSOKButton == [uploadPanel runModal]) {
    NSLog(@"ok");
}

for (int i = 0; i < 10000; i++) {
    NSLog(@"%d",i);
}

顺便说一句,NSSavePanel没有这样的问题。

有没有办法解决这个问题?

UPDATE1: 我尝试过Abhi Beckert提供的方法,但仍然不起作用:(

if (NSOKButton == [uploadPanel runModal]) {
    NSLog(@"ok");
    [uploadPanel close];
}

for (int i = 0; i < 10000; i++) {
    NSLog(@"%d",i);
}

2 个答案:

答案 0 :(得分:3)

它没有立即关闭,因为它没有。没有理由,这就是它的运作方式。

如果您需要提前关闭它,请手动关闭它:

[uploadPanel close];

答案 1 :(得分:0)

自己获取解决方案。虽然理想的解决方案是将循环放在另一个线程中,但是处理线程安全事件太困难了。另一种解决方案是以延迟的方式执行代码。 (如下图所示)

-(IBAction)upload:(id)sender {
    NSOpenPanel *uploadPanel = [NSOpenPanel openPanel];
    if ([uploadPanel runModal] == NSOKButton) {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC / 100), dispatch_get_main_queue(), ^(void){
            for (int i = 0; i < 10000; i++) {
                NSLog(@"%d",i);
            }
        });
    }
}
相关问题