【问题标题】:NSSavePanel: Squelching the "confirm replace?" dialogNSSavePanel:压制“确认替换?”对话
【发布时间】:2009-12-18 19:55:28
【问题描述】:

在导航服务领域,可以指定kNavDontConfirmReplacement 作为创建NavDialogRef 的选项,当使用已存在的文件名保存文件时,该选项不会要求用户确认替换文件。如何使用 Cocoa NSSavePanel 指定等效行为?

【问题讨论】:

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

标签: cocoa macos nssavepanel


【解决方案1】:

这是如何做到的:

  1. 添加一个委托来处理 NSSavePanel 回调
  2. 在您的委托中覆盖 - (NSString*)panel:(id)sender userEnteredFilename:(NSString*)filename confirmed:(BOOL)okFlag
  3. 在委托中:
    1. 如果okFlagfalse,则返回filename
    2. 否则,将filename 保留为您的委托中的NSString*
    3. 返回一些不太可能是实际文件名的唯一字符串
  4. NSSavePanel 返回您的代码时,从您的委托方法中提取文件名的值,并丢弃NSSavePanel 告诉您的任何文件名(这应该是您的唯一字符串)。

由于userEnteredFilename: 在进行确认替换检查之前由操作系统调用,它使您有机会获得用户指定的内容,而无需让操作系统了解机密信息。唯一的字符串将确保确认替换对话框不会意外弹出。

粗略但有效。

【讨论】:

  • 请注意文件名可能包含斜杠。保存面板的默认行为似乎是将它们转换为冒号。
  • 这似乎违背了人机界面准则,以免破坏用户的期望。必须有一种正确(即不那么粗暴)的方式来做到这一点。顺便说一句,非常巧妙的想法
【解决方案2】:

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

【讨论】:

【解决方案3】:

您的客户在遇到 NSSavePanel 时会期待准确的确认警报,因此不要自定义它。

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

例如,如果您要求您的客户选择一个文件来附加新数据,那么 NSOpenPanel 就可以很好地工作;如果客户想要将新数据保存到新文件中(而不是附加到现有文件中),只需单击“创建新文件”按钮即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多