Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSSavePanel:压制“保存面板”;确认更换?“;对话_Cocoa_Macos_Nssavepanel - Fatal编程技术网

Cocoa NSSavePanel:压制“保存面板”;确认更换?“;对话

Cocoa NSSavePanel:压制“保存面板”;确认更换?“;对话,cocoa,macos,nssavepanel,Cocoa,Macos,Nssavepanel,在Nav服务世界中,可以指定knavontconfirmReplacement作为创建NavDialogRef的选项,该选项在使用已存在的文件名保存时不会要求用户确认文件的替换。如何使用CocoaNSSavePanel指定等效行为?不,使用NSSavePanel没有简单的方法。理论上,您可以使用一个类别扩展NSSavePanel,并覆盖某些私有方法。不过,我快速查看了一下,这一点并不简单。您的客户在面对NSSavePanel时会期望得到准确的确认警报,所以不要自定义它 我不确定您计划使用哪种自定

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

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

您的客户在面对NSSavePanel时会期望得到准确的确认警报,所以不要自定义它

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


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

以下是操作方法:

  • 添加委托以处理NSSavePanel回调
  • 覆盖
    -(NSString*)面板:(id)发件人用户输入的文件名:(NSString*)文件名已确认:(BOOL)代理中的okFlag
  • 在代表中:
  • 如果
    okFlag
    false
    ,则返回
    filename
  • 否则,将
    filename
    作为
    NSString*
    保留在代理中
  • 返回一些不太可能是实际文件名的唯一字符串
  • NSSavePanel
    返回到您的代码时,从委托方法中提取filename的值,并放弃filename
    NSSavePanel
    告诉您的任何内容(这应该是您的唯一字符串)
  • 由于操作系统在进行确认替换检查之前调用了
    userEnteredFilename:
    ,因此您有机会获得用户指定的内容,而不让操作系统知道该秘密。唯一的字符串将确保确认替换对话框不会意外弹出


    粗俗但有效。

    您能解释一下为什么要这样做吗?我想用我自己的“确认覆盖”对话框替换它。可以劫持未记录的API
    -(BOOL)\u覆盖现有的文件检查:(id)arg1和/或
    -(BOOL)\您应该发出文件覆盖警报:(id)arg1
    并返回
    NO
    。但对沙盒应用程序不起作用。@Eljay你是冠军!关于使用覆盖的一些讨论如下:注意文件名可能包含斜杠。“保存”面板的默认行为似乎是将它们转换为冒号。这似乎与人机界面指南相反,不违背用户的期望。必须有一种正确的方法来做这件事。非常圆滑的想法顺便说一句