3

我是 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 代码,看起来就是这样。

4

1 回答 1

1

两个注意事项:

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

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

于 2011-01-14T16:35:11.157 回答