【问题标题】:Close NSOpenPanel as soon as file/directory has been selected选择文件/目录后立即关闭 NSOpenPanel
【发布时间】:2011-01-14 07:42:05
【问题描述】:

我是 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 nsoperation nsopenpanel


    【解决方案1】:

    两个音符:

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

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

    【讨论】:

    • 谢谢。 fwiw, -chooseDidEnd:returnCode:contextInfo: 几乎一字不差地取自 Apple 的 NSOperationSample 示例代码。你能解释一下为什么这个版本违反了对象所有权规则吗?谢谢。
    • “几乎一字不差地取自 Apple 的 NSOperationSample 示例代码”[NSOpenPanel openPanel]创建它,它会自动自动发布)。
    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2019-12-03
    • 2019-09-29
    相关资源
    最近更新 更多