Created
May 2, 2016 21:34
-
-
Save asos-danieltavares/ba328cce4c085dc11a02cc22ea31115e to your computer and use it in GitHub Desktop.
Storyboard Swift Generics
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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