gpt4 book ai didi

objective-c - MacOSX 下奇怪的文件对话框

转载 作者:行者123 更新时间:2023-12-03 17:53:14 25 4
gpt4 key购买 nike

我正在尝试为 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
{...}

虽然这基本上有效,但一切都有点不对劲:

-对话框永远不会以相同的方式初始化两次(不同的初始目录、布局模式...)。

-有时初始目录显示为空,直到我再次选择另一个目录和第一个目录。

-“右键单击”菜单不会显示。

-滚动反弹效果不起作用(!!!)。我可以无限向下滚动,直到所有内容都消失。

-在列模式下,预览不起作用(加载图标永远旋转),但在大图标模式下查看时,图像有正确的预览。

就像有一个完整的更新线程没有运行。它可能与调用该库的奇怪上下文有关:从使用 JNA 的 java 程序。但我希望也许有人知道一些可以解决问题的小技巧,例如“只需调用 [system startUpdateTask]”或其他东西:)

感谢您的帮助

最佳答案

(评论回复后:)

一些东西供您尝试(我无法测试您的场景)。 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];

或者类似的东西。

关于objective-c - MacOSX 下奇怪的文件对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19298777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com