Skip to content

Instantly share code, notes, and snippets.

@asos-danieltavares
Created May 2, 2016 21:34
Show Gist options
  • Save asos-danieltavares/ba328cce4c085dc11a02cc22ea31115e to your computer and use it in GitHub Desktop.
Save asos-danieltavares/ba328cce4c085dc11a02cc22ea31115e to your computer and use it in GitHub Desktop.
Storyboard Swift Generics
//
// Storyboard+Loader.swift
// StoryboardGenerics
//
// Created by Daniel Tavares on 29/04/2016.
// Copyright © 2016 Daniel Tavares. All rights reserved.
//
import UIKit
protocol StoryboardLoader {}
extension StoryboardLoader where Self: RawRepresentable, Self.RawValue == String {
func loadControllerInNavigationController<T: UIViewController>(controllerID: String) -> T? {
return Loader.EmbeddedController(self.rawValue, identifier: controllerID).controller()
}
func loadController<T: UIViewController>() -> T? {
return Loader.Name(self.rawValue).controller()
}
func loadController<T: UIViewController>(identifier identifier: String) -> T? {
return Loader.Controller(self.rawValue, identifier: identifier).controller()
}
}
extension UIStoryboard {
func loadController<T: UIViewController>(type: T.Type) -> T? {
guard let controller = self.instantiateViewControllerWithIdentifier(String(type)) as? T else {
return nil
}
return controller
}
}
private enum Loader<T: UIViewController> {
case Name(String)
case Controller(String, identifier: String)
case EmbeddedController(String, identifier: String)
func controller() -> T? {
switch self {
case let .Name(storyboard):
let storyboard = UIStoryboard(name: storyboard, bundle: nil)
guard let controller = storyboard.instantiateViewControllerWithIdentifier(String(T)) as? T else {
return nil
}
return controller
case let .Controller(storyboard, identifier):
let storyboard = UIStoryboard(name: storyboard, bundle: nil)
guard let controller = storyboard.instantiateViewControllerWithIdentifier(identifier) as? T else {
return nil
}
return controller
case let .EmbeddedController(storyboard, identifier):
let storyboard = UIStoryboard(name: storyboard, bundle: nil)
guard let navController = storyboard.instantiateViewControllerWithIdentifier(identifier) as? UINavigationController, controller = navController.viewControllers.first as? T else {
return nil
}
return controller
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment