Skip to content

Instantly share code, notes, and snippets.

@Gurdeep0602
Last active April 2, 2024 09:54
Show Gist options
  • Select an option

  • Save Gurdeep0602/4fc3892c1b2861d4cd2062ddfddf3262 to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown
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
Copy Markdown

The usage example looks sweet! Thanks for sharing 👍

@vinamelody
Copy link
Copy Markdown

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

@dtvanh
Copy link
Copy Markdown

dtvanh commented May 31, 2017

Thanks for sharing. Keep it up bro ^^

@sreeram780
Copy link
Copy Markdown

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
Copy Markdown

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
Copy Markdown

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

@aksthelion
Copy link
Copy Markdown

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
Copy link
Copy Markdown

thanks for sharing

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