objective-c - 在 NSSavePanel 中按下 OK 后无法调用 beginSheet?

标签 objective-c cocoa nsapplication nssavepanel cocoa-sheet

我的 cocoa 程序有一个保存功能,当用户选择保存目的地时,我必须调出另一个 NSPanel,以显示某种状态(即完成保存文件需要多长时间。这里是我的代码:

- (IBAction)savePressed:(id)sender {
    __block NSSavePanel *saveDlg = [NSSavePanel savePanel];
    // Enable options in the dialog.
    [saveDlg setCanCreateDirectories:YES];
    [saveDlg setAllowedFileTypes:[NSArray arrayWithObject:@"zip"]];
    [saveDlg setCanSelectHiddenExtension:YES];
    [saveDlg beginSheetModalForWindow:self.window completionHandler:^ (NSInteger result) {
        if (result == NSOKButton) {
            [self triggerNSPanel];
        }

        saveDlg = nil;

    }];

}

- (void) triggerNSPanel {
    if (!self.myPanel)
        self.myPanel = [[NSPanel alloc] init];
    [NSApp beginSheet:self.myPanel modalForWindow:self.window modalDelegate:nil didEndSelector:nil contextInfo:nil];
....
}

所以一旦 NSSavePanel 消失(即按下 ok),我的 NSPanel 显示大约 1/2 秒,然后它就消失了,即使我没有调用 NSApp endSheet

最佳答案

可能是您从完成处理程序中调用 beginSheet 时出现的问题。调用后可能会进行一些清理工作,从而杀死第二张工作表。尝试通过performSelector:afterDelay发送triggerNSPanel(延迟可以为0,因此它在下一轮运行循环中触发)。

关于objective-c - 在 NSSavePanel 中按下 OK 后无法调用 beginSheet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16105887/

相关文章:

objective-c - 无法运行 performSelector : afterDelay from CoreMotion Block

cocoa - 如何判断 NSWindow 是否处于事件状态

macos - 如何删除 NSTableView 的边框并更改单元格选择颜色与 Finder 的颜色相同?

objective-c - 具有可配置 URL 的 webview

objective-c - 如何使状态栏应用程序与其他状态栏应用程序一起捕获 'applicationDidResignActive:'?

objective-c - 响应 "Hide Others"Mac OS X

objective-c - 如何在 Mac OS X Lion 上双屏显示

iOS状态栏和UIView

objective-c - 使用 iOS NSRegularExpression 的 Ruby 风格字符串插值

cocoa - 自定义 UITableViewController 不加载静态单元格