Search code examples
cocoamacosnssavepanel

NSSavePanel: Squelching the "confirm replace?" dialog


In the Nav Services world one could specify kNavDontConfirmReplacement as an option to create a NavDialogRef that would not ask the user to confirm the replacement of a file when saving with a file name that already exists. How do I specify an equivalent behavior with the Cocoa NSSavePanel?


Solution

  • Here's how it can be done:

    1. Add a delegate to handle NSSavePanel callbacks
    2. Override - (NSString*)panel:(id)sender userEnteredFilename:(NSString*)filename confirmed:(BOOL)okFlag in your delegate
    3. In the delegate:
      1. If okFlag is false, return filename
      2. Otherwise, retain filename as an NSString* in your delegate
      3. Return some unique string that is highly unlikely to be the name of an actual file
    4. When NSSavePanel returns to your code, pull the value of filename from your delegate method, and discard whatever filename NSSavePanel 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.