我是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] 用这种方法违反了可可的对象所有权规则!因此,如果您在没有该呼叫的情况下泄露面板,则应将其修复在创建面板的方法中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top