NSSavePanel:抑制“确认替换?”对话框

4
在 Nav Services 领域,可以通过指定选项 kNavDontConfirmReplacement 来创建一个 NavDialogRef 对象,当使用已经存在的文件名保存文件时,该对象不会要求用户确认替换操作。那么我该如何在 Cocoa 的 NSSavePanel 中实现类似的功能呢?

你能解释一下为什么你想这样做吗? - Mike Abdullah
我想用自己的确认覆盖对话框来替换它。 - fbrereto
1
可以劫持未记录的API - (BOOL)_overwriteExistingFileCheck:(id)arg1; 和/或 - (BOOL)_shouldAlertForFileOverwrite:(id)arg1; 并返回 NO。但对于沙盒应用程序无效。 - Eljay
@Eljay 你是一个冠军! - fbrereto
3个回答

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

请注意文件名可能包含斜杠。保存面板的默认行为似乎是将它们转换为冒号。 - George
这似乎违反了人机界面指南,不应该打破用户的期望。一定有一种正确(即不那么粗糙)的方法来实现这一点。顺便说一句,这是一个非常棒的想法。 - UKDataGeek

0

不,使用NSSavePanel没有简单的方法来实现这一点。理论上,您可以通过类别扩展NSSavePanel并覆盖某些私有方法来实现。但我快速查看了一下,发现这并不简单。


这里有一些关于使用覆盖的讨论: http://www.cocoadev.com/index.pl?DisableAlertBoxInNSSavePanel - Ken Aspeslagh

0

你的客户在面对 NSSavePanel 时,会期望得到精确的确认警报,因此不要进行自定义。

我不确定您计划使用什么类型的自定义确认覆盖对话框,但我建议您改用 NSOpenPanel,并使用“创建新文件”按钮自定义此对话框框(我认为您可以通过 setAccessoryView API 实现)。

例如,如果您要求客户选择要附加新数据的文件,则 NSOpenPanel 将非常有效;如果客户希望将新数据保存到新文件中(而不是附加到现有文件中),则“创建新文件”按钮只需要额外点击一次即可。


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