0

我正在从 boost C++ 创建的线程调用 NSOpenPanel。

面板行为不规律并且对鼠标的响应不佳,即单击对象有时在单击顶级组合框时不会提高响应。

我要运行一个单独的运行循环吗?我正在运行一个 runModalForDirectory,它应该负责运行它自己的循环。

我还创建了一个单独的 objc 类,该类执行 performSelectorOnMainThread 以在主线程中显示面板,但行为仍然相同。

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

我也尝试过使用 waitUntilDone:NO 并运行 CFRunLoopRunInMode 这也无济于事。

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

1 回答 1

1

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

向我们展示您使用的代码,performSelectorOnMainThread以便我们帮助找出您可能仍会遇到问题的原因。我怀疑您正在使用它调用单个方法-不要;它不会按您期望的方式工作。回调主线程以了解您与NSOpenPanel.

于 2010-12-20T21:25:25.407 回答