How to disable reopening documents when app started via launchIsDefaultUserInfoKey

Viewed 55

On macOS unlike iOS, it appears if you want to disable reopening documents at launch, you need to rely on the application delegate notifications vs the newer methods - with an options argument, like on iOS:

  • applicationWillFinishLaunching(_:), here you want to instantiate your sub-classed document controller
//  We need our own to reopen our "document" urls
_ = DocumentController.init()
  • applicationDidFinishLaunching(_:), here you want to inspect the supplied userInfo
if let info = note.userInfo{
    if let launchURL = info[NSApplication.launchIsDefaultUserInfoKey] as? String  {
        Swift.print("launchIsDefaultUserInfoKey: notif \(launchURL)")
        disableDocumentReOpening = launchURL.boolValue
    }
    if let notif = info[NSApplication.launchUserNotificationUserInfoKey] as? String {
        Swift.print("applicationDidFinishLaunching: notif \(notif)")
        disableDocumentReOpening = true
    }
}

so when my document controller is called to do the doc restores, it would see this flag within the app delegate: var disableDocumentReOpening = false.

func restoreWindow(withIdentifier identifier: NSUserInterfaceItemIdentifier, state: NSCoder, completionHandler: @escaping (NSWindow?, Error?) -> Void) {
    if (NSApp.delegate as! AppDelegate).disableDocumentReOpening {
    completionHandler(nil, NSError.init(domain: NSCocoaErrorDomain, code: NSUserCancelledError, userInfo: nil) )
    }
    else
    {
        NSDocumentController.restoreWindow(withIdentifier: identifier, state: state, completionHandler: completionHandler)
    }
}

but unfortunately, I have something wrong but what? Manually launching the app in debugger, it appears the document controller restore call is ahead of the app delegate's routine to inspect the userInfo.

I had read a SO post on this, showing an objective-c code snippet, but flag was local to the controller, but didn't understand how you could have a read/write class var - as I tried. Also didn't understand its use of a class function as doc says its an instance method, but trying that as well didn't work either.

What am I missing?

0 Answers
Related