0

我不明白为什么当我单击“确定”按钮时面板不会立即关闭。

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);
}
4

2 回答 2

3

它不会立即关闭,因为它没有。没有理由,这就是它的工作原理。

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

[uploadPanel close];
于 2014-05-07T03:40:49.690 回答
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);
            }
        });
    }
}
于 2014-05-09T06:37:11.260 回答