我正在尝试为OS X构建一个基本动态库,它只显示一个用于打开文件的对话框。 我的代码看起来像这样:
NSOpenPanel * dlg = [NSOpenPanel openPanel];
...//setting title and other properties for dlg
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_main_queue(), ^
{
resButton = [dlg runModal];
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
if (resButton == NSFileHandlingPanelOKButton)//resButton is global
{...}
现在虽然这基本上有效,但一切都有点不对:
- 对话框永远不会以相同的方式初始化两次(不同的初始目录,布局模式......)。
- 有时初始目录显示为空,直到我再次选择另一个和第一个目录。
- “右键单击”菜单不会显示。
-Scrolling弹回效果不起作用(!!!)。我可以无限期地向下滚动,直到一切都消失。
- 在列模式下,预览不起作用(加载图标会永久转动),但在大图标模式下查看时,图像会有适当的预览。
就像有一个完整的更新线程没有运行。它可能与调用lib的奇怪上下文有关:来自使用JNA的java程序。但我希望也许有人知道一个可以解决问题的小技巧,比如“只需调用[system startUpdateTask]”或者其他东西:)
感谢您的帮助
答案 0 :(得分:1)
(评论回复后:)
你要尝试的东西(我无法测试你的场景)。自引入沙箱以来,NSOpenPanel
/ NSSavePanel
是非常精细的类,需要谨慎处理。
正如您所发现的,所有UI操作都需要在主线程上执行。但是,请尝试使用同步dispatch_*
:
performSelectorOnMainThread
函数
NSOpenPanel * dlg = [NSOpenPanel openPanel];
... //setting title and other properties for dlg
resButton = [dlg performSelectorOnMainThread:@selector(runModal)
withObject:nil
waitUntilDone:YES];
if (resButton == NSFileHandlingPanelOKButton) //resButton is global
{...}
这可能会解决您的问题,或者不会......
<强>附录强>
我的不好,正如你正确指出performSelectorOnMainThread
没有返回值。你可以改为:
将resButton
作为实例变量添加到您的班级。
添加方法:
- (void) myRunModal:(NSOpenPanel *)dlg
{
resButton = [dlg runModal];
}
将代码更改为:
[self performSelectorOnMainThread:@selector(myRunModal:)
withObject:dlg
waitUntilDone:YES];
或类似的东西。