NSSavePanel:确认“确认替换?”对话

时间:2009-12-18 19:55:28

标签: cocoa macos nssavepanel

在导航服务世界中,可以指定kNavDontConfirmReplacement作为创建NavDialogRef的选项,在使用已存在的文件名保存时,不会要求用户确认替换文件。如何使用Cocoa NSSavePanel

指定等效行为

3 个答案:

答案 0 :(得分:4)

以下是如何做到的:

  1. 添加委托来处理NSSavePanel回调
  2. 覆盖代理中的- (NSString*)panel:(id)sender userEnteredFilename:(NSString*)filename confirmed:(BOOL)okFlag
  3. 在代表中:
    1. 如果okFlagfalse,请返回filename
    2. 否则,请将filename保留为代理
    3. 中的NSString*
    4. 返回一些不太可能是实际文件名称的唯一字符串
  4. NSSavePanel返回您的代码时,从您的委托方法中提取文件名的值,并丢弃NSSavePanel告诉您的任何文件名(应该是您唯一的字符串)。
  5. 由于操作系统在进行确认 - 替换检查之前调用userEnteredFilename:,因此它使您有机会获得用户指定的内容,而不会让操作系统知道该秘密。唯一字符串将确保不会意外弹出确认替换对话框。

    总而有效。

答案 1 :(得分:0)

不,使用NSSavePanel没有简单的方法。理论上,您可以使用类别扩展NSSavePanel并覆盖某些私有方法。我快速浏览了一下,没有什么简单的。

答案 2 :(得分:0)

您的客户在面对NSSavePanel时会发出确切的确认提醒,因此请勿对其进行自定义。

我不确定您正在计划什么样的自定义确认覆盖对话框,但我建议您使用NSOpenPanel,并使用“创建新文件”按钮自定义此对话框? (我相信你可以通过setAccessoryView API来做到这一点。)

例如,如果您要求客户选择要附加新数据的文件,NSOpenPanel将会很好地工作;如果客户想要将新数据保存到新文件(而不是附加到现有文件),则只需再点击一次“创建新文件”按钮。