Safe cross references between scenes in an OS X storyboard
Safe cross references between scenes in an OS X storyboard
- Subject: Safe cross references between scenes in an OS X storyboard
- From: Bill Cheeseman <email@hidden>
- Date: Wed, 09 Mar 2016 08:32:34 -0500
I am using storyboards in an OS X application written in Swift 2. It is a single window "shoebox" application that does not use NSDocument or Core Data. It is built with the Xcode 7.2.1 storyboard template, where the storyboard entry point is the main window controller scene and a "window content" relationship segue leads to the window's content view scene.
In my AppDelegate class, I want to declare an instance property referring to the main window's content view controller. I need to refer to the content view controller because my AppDelegate provides programmatic content for one of the menu bar's menus and it needs to update a duplicate of that menu in a popup button in the content view. I anticipate needing a reference to the content view controller for other purposes, too, so I want to avoid duplicating code by putting it in an instance variable.
It is of course impossible to set the property's value before the window's content view controller exists. The applicationDidFinishLaunching(_:) delegate method is apparently too early. If I set it there with 'mainContentViewController = NSApp.mainWindow!.contentViewController as! MainContentViewController', I get this fatal error at launch: "unexpectedly found nil while unwrapping an Optional value."
I therefore set it using a lazy instance variable, like this:
lazy var mainContentViewController: MainContentViewController = {
NSApp.mainWindow!.contentViewController as! MainContentViewController
}()
This works fine -- but only if I take care to use the instance variable after the content view controller becomes available. My question is whether the following is a safe and sensible way to take care of the possibility that I might accidentally try to use it too early:
lazy var mainContentViewController: MainContentViewController? = {
guard let window = NSApp.mainWindow,
let controller = window.contentViewController
else {return nil}
return controller as? MainContentViewController
}()
(I tried returning 'controller as! MainContentViewController', but I got this warning: "Treating a forced downcast to 'MainContentViewController' as optional will never produce 'nil'." I have to declare the variable as an Optional type because the guard statement might return nil.)
--
Bill Cheeseman - email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden