1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- /*********************************************
- *
- * This code is under the MIT License (MIT)
- *
- * Copyright (c) 2016 AliSoftware
- *
- *********************************************/
- import UIKit
- // MARK: Protocol Definition
- /// Make your UIViewController subclasses conform to this protocol when:
- /// * they *are* Storyboard-based, and
- /// * this ViewController is the initialViewController of your Storyboard
- ///
- /// to be able to instantiate them from the Storyboard in a type-safe manner
- public protocol StoryboardBased: class {
- /// The UIStoryboard to use when we want to instantiate this ViewController
- static var sceneStoryboard: UIStoryboard { get }
- }
- // MARK: Default Implementation
- public extension StoryboardBased {
- /// By default, use the storybaord with the same name as the class
- static var sceneStoryboard: UIStoryboard {
- return UIStoryboard(name: String(describing: self), bundle: Bundle(for: self))
- }
- }
- // MARK: Support for instantiation from Storyboard
- public extension StoryboardBased where Self: UIViewController {
- /**
- Create an instance of the ViewController from its associated Storyboard's initialViewController
- - returns: instance of the conforming ViewController
- */
- static func instantiate() -> Self {
- let viewController = sceneStoryboard.instantiateInitialViewController()
- guard let typedViewController = viewController as? Self else {
- fatalError("The initialViewController of '\(sceneStoryboard)' is not of class '\(self)'")
- }
- return typedViewController
- }
- }
|