objective-cmacosswiftxcode-storyboardwindow-management

How does OS X load a storyboard based app, and how does it do window management?


I'm working on a brand new OS X app, and I've taken the daring route of working with a few technologies I haven't used much before. (I'm an iOS developer.)

I'm using Storyboards, Swift, and Core Data in my app, all from the Xcode template. When my app starts, it creates an NSWindowController from a Storyboard.

In another OS X app I made in Objective-C, I use the delegate method applicationShouldHandleReopen:hasVisibleWindows: to tell the window controller to bring up the window controller's window.

I know that the language semantics remain the same in Swift, but Core Data and Storyboards leave me with two questions.

  1. Does the fact that my project uses Core Data change it into a "document-based app" and therefore change the way windows are managed?

  2. In my old project I'm using nibs instead of storyboards. It seems that I'm manually instantiating an NSWindowController there, and using it to manage re-opening. If there's a way to get at the one my Storyboard is undoubtedly making for me, that would be optimal, right? Is just attaching an outlet to my App Delegate the way to go? Is there another convention?


Solution

    1. No. Checking the "Create Document-Based Application" is what made it a document based app. The decision to use Core Data is separate.

    2. The Storyboard you get when you make an OS X Document based app is a bit atypical. Notice that there is no arrow in the storyboard telling you where the entry point it. What happens is "Document" is instantiated. It has a method:

      override func makeWindowControllers() {
          // Returns the Storyboard that contains your Document window.
          let storyboard = NSStoryboard(name: "Main", bundle: nil)!
          let windowController = storyboard.instantiateControllerWithIdentifier("Document Window Controller") as NSWindowController
          self.addWindowController(windowController)
      }
      

    It goes looking in the storyboard for a controller with the identifier @"Document Window Controller" (which just so happens is that window controller). Document keeps a collection of windowControllers. so Document instantiates it and adds the windowController to that list.

    So Document already has a reference to the window controller in Document.windowControllers

    (Can someone tell me WHY the Document gets created though? I can't see what actually triggers its creation)