Skip to content

Instantly share code, notes, and snippets.

@Gurdeep0602
Last active April 2, 2024 09:54
Show Gist options
  • Star 88 You must be signed in to star a gist
  • Fork 15 You must be signed in to fork a gist
  • Save Gurdeep0602/4fc3892c1b2861d4cd2062ddfddf3262 to your computer and use it in GitHub Desktop.
Save Gurdeep0602/4fc3892c1b2861d4cd2062ddfddf3262 to your computer and use it in GitHub Desktop.
AppStoryboard enumeration
//
// AppStoryboards.swift
// AppStoryboards
//
// Created by Gurdeep on 15/12/16.
// Copyright © 2016 Gurdeep. All rights reserved.
//
import Foundation
import UIKit
enum AppStoryboard: String {
case Main
var instance : UIStoryboard {
return UIStoryboard(name: self.rawValue, bundle: Bundle.main)
}
func viewController<T : UIViewController>(_ viewControllerClass : T.Type,
_ function : String = #function,
_ line : Int = #line,
_ file : String = #file) -> T {
let storyboardID = (viewControllerClass as UIViewController.Type).storyboardID
guard let scene = instance.instantiateViewController(withIdentifier: storyboardID) as? T else {
fatalError("ViewController with identifier \(storyboardID), not found in \(self.rawValue) Storyboard.\nFile : \(file) \nLine Number : \(line) \nFunction : \(function)")
}
return scene
}
func initialViewController() -> UIViewController? {
return instance.instantiateInitialViewController()
}
}
extension UIViewController {
// Not using static as it wont be possible to override to provide custom storyboardID then
class var storyboardID : String {
return "\(self)"
}
static func instantiate(from appStoryboard: AppStoryboard,
function : String = #function,
line : Int = #line,
file : String = #file) -> Self {
return appStoryboard.viewController(self, function, line, file)
}
}
@Gurdeep0602
Copy link
Author

Gurdeep0602 commented Oct 30, 2016

Usage :

    let greenScene = GreenVC.instantiate(fromAppStoryboard: .Main)

    let greenScene = AppStoryboard.Main.viewController(viewControllerClass: GreenVC.self)

    let greenScene = AppStoryboard.Main.instance.instantiateViewController(withIdentifier: GreenVC.storyboardID)

@DivineDominion
Copy link

The usage example looks sweet! Thanks for sharing 👍

@vinamelody
Copy link

Hi, what are the file, line and function variables referring to?

@dtvanh
Copy link

dtvanh commented May 31, 2017

Thanks for sharing. Keep it up bro ^^

@sreeram780
Copy link

Thanks for Sharing but root window was not setting properly.whose view is not in the window hierarchy getting this when i switch storyboards alternatively.

@wiamasosogt
Copy link

I like your architecture very much. I implement it right now with "CleanStore" project by Raymond Law. It works very fine as long as I build and run it. But I have an issue with TTD. Running the test raises an error in AppStoryBoards in the guard statement on line 26. I think the reason is that as long as the UIViewController.Type 's module (here "CleanStore.AnyVC" is the app itself there' s no problem. But starting the test, the module is the test module (here "CleanStoreTest.AnyVC"). "StoryBoard ID" 's are set correctly. Can you help please?

@vinothvino42
Copy link

Thank you so much man! Keep up the good work!

@aksthelion
Copy link

aksthelion commented Oct 12, 2019

How to prevent app crashing if view controller is not found in the storyboard which may happen if you specify incorrect storyboard?

@Omar-Abdelrazik-Kobaisy

thanks for sharing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment