Re: Canceling NSSavePanel Hang App


Sandor Szatmari
 

Thanks Sak,

My discovery seemed random and unsettling, so I kept digging.  I will read the docs you’re referring to But a sheet does seem to do the trick.  What’s weird is this code has worked for years, so it must be some changes to the SDK I am updating to.


Sandor

On Apr 2, 2020, at 14:31, Sak Wathanasin <sw@...> wrote:



On 2 Apr 2020, at 18:54, Sandor Szatmari <admin.szatmari.net@...> wrote:

Took a guess and enabled sandbox and added read/write to user selected file and the hang went away.  Is it true that I cannot make an unsandboxed app and uses the NSSavePanel?  I know this is a data point of one, so I want to be careful what conclusions I draw… any thoughts?

No, I have a non-sandboxed app and it works fine. I think the problem is that you are using NSSavePanel:runModal. If you look in the doc'n, it says:

"This method invokes NSApplication's runModalForWindow ..."

If it's doing that, then you need to cancel the modal yourslef (as with any call of runModalForWindow). Try putting a

[NSApp stopModalWithCode:NSModalResponseCancel];

in your "else" clause.

However, it may be simpler to use a sheet modal:
...setup code...
    [panel beginSheetModalForWindow:owningWindow
                  completionHandler:^(NSInteger result){
                      if (result == NSFileHandlingPanelOKButton)
                      {
                          self.saveFileURL = [[panel URLs] objectAtIndex:0];
                          [self writeToFileAtURL:self.saveFileURL];
                      }
                  }
     ];

You can spin the writing to a file off to a separate thread if it takes a long time.

Hope this helps,

Sak


Join cocoa@apple-dev.groups.io to automatically receive all group messages.