一旦选择了文件/目录,请立即关闭Nsopenpanel
-
11-10-2019 - |
题
我是Nsopenpanel/nssavepanel/nspanel的新手。我正在使用Nsopenpanel选择一个目录,其文件将重新迭代并进行一些相当耗时的处理。
我可以在面板上调用-close,但这不会返回聚焦到主窗口。我已经读了很多有关“解散”面板的信息 - 但是我还没有找到任何“解雇”而不是“关闭”面板或窗口的方法。
只是我需要产生背景线程(NSoperation)吗?
这就是我的choosedidend:return Code: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并没有动画,并且主窗口直到 后 -dolotsoftimecumingwork:完成。
更新 只是查看了nsoperations样本代码,这似乎是必须走的路。
解决方案
两个注释:
首先,在可可中,事件处理和绘图发生在主线程上。因此,在那里同步调用冗长的方法(这是您无反应式UI的原因)绝不是一个好主意。
因此,是的,您应该将计算昂贵的任务移交给该方法的辅助线程,例如 IBAction
.
第二,打电话 [panel release]
用这种方法违反了可可的对象所有权规则!因此,如果您在没有该呼叫的情况下泄露面板,则应将其修复在创建面板的方法中。
不隶属于 StackOverflow