在导航服务世界中,可以指定kNavDontConfirmReplacement
一个选项来创建一个NavDialogRef
在使用已经存在的文件名保存时不会要求用户确认替换文件的选项。如何使用 Cocoa 指定等效行为NSSavePanel
?
3 回答
Here's how it can be done:
- Add a delegate to handle NSSavePanel callbacks
- Override
- (NSString*)panel:(id)sender userEnteredFilename:(NSString*)filename confirmed:(BOOL)okFlag
in your delegate - In the delegate:
- If
okFlag
isfalse
, returnfilename
- Otherwise, retain
filename
as anNSString*
in your delegate - Return some unique string that is highly unlikely to be the name of an actual file
- If
- When
NSSavePanel
returns to your code, pull the value of filename from your delegate method, and discard whatever filenameNSSavePanel
told you (which should be your unique string).
Since userEnteredFilename:
is called by the OS before the confirm-replace check is made it gives you a chance to get what the user specified without letting the OS in on the secret. The unique string will assure that the confirm-replace dialog is not popped accidentally.
Gross but efficacious.
不,没有简单的方法可以使用 NSSavePanel 做到这一点。理论上,您可以使用类别扩展 NSSavePanel 并覆盖某些私有方法。不过,我快速浏览了一下,并没有什么简单的。
您的客户在面对 NSSavePanel 时会期待准确的确认警报,因此不要自定义它。
我不确定您计划使用哪种自定义的确认覆盖对话框,但我是否建议您改用 NSOpenPanel,并使用“创建新文件”按钮自定义此对话框?(我相信你可以通过 setAccessoryView API 做到这一点。)
例如,如果您要求您的客户选择一个文件来附加新数据,那么 NSOpenPanel 会很好地工作;如果客户想要将新数据保存到新文件(而不是附加到现有文件),只需单击“创建新文件”按钮即可。