gpt4 book ai didi

cocoa - 选择文件/目录后立即关闭 NSOpenPanel

转载 作者:行者123 更新时间:2023-12-03 16:21:45 25 4
gpt4 key购买 nike

我是 NSOpenPanel/NSSavePanel/NSPanel 的新手。我正在使用 NSOpenPanel 选择一个目录,我的应用程序将遍历该目录的文件并进行一些相当耗时的处理。

我可以在面板上调用 -close,但这不会将焦点返回到主窗口。我读过很多关于“关闭”面板的内容 - 但我还没有找到任何“关闭”而不是“关闭”面板或窗口的方法。

我只是需要生成一个后台线程(NSOperation)吗?

这就是我的 -chooseDidEnd:returnCode:contextInfo:

-(void) chooseDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
[panel orderOut:self];
[panel release];

if (returnCode == NSFileHandlingPanelOKButton)
{
[progressIndicator startAnimation:self];
[self doLotsOfTimeConsumingWork:[[panel URL] path]];
[progressIndicator stopAnimation:self];
}
}

虽然 NSOpenPanel 确实消失了,但我的 NSProgressIndicator 没有动画效果,主窗口也没有激活,直到 -doLotsOfTimeConsumingWork: 完成后

更新刚刚查看了 NSOperationSample 代码,看起来就是这样。

最佳答案

两个注意事项:

首先,在 Cocoa 中,事件处理和绘制发生在主线程上。因此,在那里同步调用冗长的方法从来都不是一个好主意(这就是 UI 无响应的原因)。
因此,是的,您应该通过此方法将计算量大的任务移交给辅助线程,就像任何 IBAction 一样。

其次,在该方法中调用[panel release]违反了Cocoa的对象所有权规则!因此,如果您在没有该调用的情况下泄漏了面板,则应该在创建面板的方法中修复该问题。

关于cocoa - 选择文件/目录后立即关闭 NSOpenPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4688925/

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