NSSavePanel在Yosemite上崩溃

4

我正在使用NSSavePanel来保存图像。

我已经使用了IKSaveOption添加到了NSSavePanel中。 当保存面板尝试为窗口打开表单时,它会崩溃并显示以下内容:

*** 在-[IKSaveOptionsContainer _didChangeHostsAutolayoutEngineTo:]中断言失败,/SourceCache/AppKit/AppKit-1343.14/Layout.subproj/NSView_Layout.m:577 - 如果_didChangeHostsAutolayoutEngineTo:YES,则应将自动调整大小的蒙版转换为约束。

我正在按照以下代码进行操作:

NSSavePanel *savePanel = [NSSavePanel savePanel];
    [savePanel setDirectoryURL:[NSURL URLWithString:NSHomeDirectory()]];
    [savePanel setDelegate:self];
    [savePanel setPrompt:NSLocalizedString(@"save",nil)];
    [savePanel setAllowedFileTypes:[NSArray  arrayWithObjects:@"png",@"jpeg",nil]];
      IKSaveOptions * opt = [[IKSaveOptions alloc] initWithImageProperties:nil
                                                          imageUTType:(NSString *)kUTTypePNG];
    [opt addSaveOptionsAccessoryViewToSavePanel:savePanel];
    [savePanel setExtensionHidden:NO];

   [savePanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result){.....
}

这段代码在Maverick上可以运行,但在Yosemite上无法运行。新的操作系统API是否有任何布局更改?


你找到解决方案了吗? - Duck
在El Cap上也会崩溃。我已经提交了rdar。请提交您的以迫使苹果修复它。 - Marek H
2个回答

3
更新2:解决方案原来很简单。
[self.saveOptions addSaveOptionsAccessoryViewToSavePanel:savePanel];
savePanel.accessoryView.translatesAutoresizingMaskIntoConstraints = YES;

更新:以下解决方法不会更改文件名的扩展名,而且根据您保存文件的方式,新格式请求可能不会被接受。
我发现了一个解决方法,并向Apple提交了一个错误报告(20595916)。这个解决方法并不理想,因为父视图的大小可能不足以显示图片选项的控件。
NSView* view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 400, 200)];
view.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
savePanel.accessoryView = view;

[self.saveOptions addSaveOptionsToView:view];

0

El Capitan + Yosemite 的解决方法是避免使用 addSaveOptionsAccessoryViewToSavePanel 添加它,而是使用 addSaveOptionsToView + 手动更新扩展名使用 allowedFileTypes

var saveOptions = IKSaveOptions()
var imageUTType = kUTTypeTIFF
var imageProperties: NSDictionary = Dictionary<String, String>()
var panel : NSSavePanel?

internal func prepareExportSavePanel(savePanel : NSSavePanel) -> Bool {
    panel = savePanel
    saveOptions = IKSaveOptions(imageProperties: imageProperties , imageUTType: imageUTType)
    saveOptions.delegate = self
    if #available(macOS 10.14, *) { //might work on earlier versions
        saveOptions.addAccessoryView(to: savePanel)
    } else {
        savePanel.accessoryView = NSView(frame: NSRect(x: 0, y: 0, width: 500, height: 200))
        saveOptions.add(to: savePanel.accessoryView)
    }

    return true
}

override func saveOptions(saveOptions: IKSaveOptions!, shouldShowUTType utType: String!) -> Bool {
    if (utType == "com.ilm.openexr-image") {
        return false
    }
    return true
}

@objc dynamic func saveOptionsChanged(_ sender: Any?) {
    imageProperties = saveOptions.imageProperties
    imageUTType = saveOptions.imageUTType
    panel?.allowedFileTypes = [imageUTType as String]
}

@objc dynamic open var canCalculateEstimatedSize : Bool {
    return false
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接