我正在通过BOOST C ++创建的线程调用Nsopenpanel。

该面板的行为不正当,对鼠标的响应不佳,即单击对象时,单击“顶级组合”框时无能为力。

我是否要运行一个单独的Runloop,我正在做一个Runmodalfordirectory,应该照顾自己的循环。

我还创建了一个单独的OBJC类,该类确实是persionSelectorOnmainthread以在主线程中显示面板,但行为仍然相同。

[ps performSelectorOnMainThread:@selector(showOpenPanel) withObject:nil 
                      waitUntilDone:YES
                      modes:[NSArray arrayWithObject:NSRunLoopCommonModes]];

我还尝试了Waituntildone:不和运行CFRUNOPRUNINMODE,这也没有帮助。

- (bool) showOpenPanel
{
    NSOpenPanel *op = [NSOpenPanel openPanel];
    [op setAllowsMultipleSelection:YES];
    [op setTitle:@"Choose File"];
    [op setMessage:@"Choose file for Importing."];
    [op setFloatingPanel:true]; 
    bool result =[op runModalForDirectory:NSHomeDirectory() file:nil types:self.fileTypes];
    if (result == NSOKButton) {
        [self setSelectedFiles:[op filenames]];
        [self setLastShowResult:true];
    }
    else {
        [self setLastShowResult:false];
    }

    [self setPanelIsDone:true]; 
    return self.lastShowResult;
}
有帮助吗?

解决方案

NSOpenPanel 是AppKit的一部分。 AppKit功能和类只能在主线程上安全使用。

向我们展示您使用的代码 performSelectorOnMainThread 因此,我们可以帮助您弄清楚为什么您可能仍然会看到问题。我怀疑您正在用它来调用单个方法 - 不;它不会按照您的期望工作。回到主线程,以全部与 NSOpenPanel.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top