Skip to content

An extremely lean implementation on the classic iOS router pattern.

Notifications You must be signed in to change notification settings

TimOliver/Beeline

Repository files navigation

Beeline

CI Version GitHub license Platform

Beeline is a very small library that aims to provide a lean, automatic implementation of the classic iOS router pattern. It extends UIViewController to retain a Router object that serves as the source of truth for controlling navigation flows for all of the view controller's children. When a child view controller wishes to transition to a new screen, it can call show() on itself and this request is passed up the view controller chain to the routing view controller.

Instructions

A very basic custom implementation looks as the following. First, we create a Swift enum conforming to Route where we can define the types of destinations with which we want to move:

enum AppRoute: Route {
    case viewController(number: Int)
}

Thanks to Swift associated enums, we can also include any custom parameters the new destination may need.

We then also make a new class which subclasses Router, which serves as our single point of truth for controlling the app flow based off the destinations we defined above:

public class AppRouter: Router {
    override func show(_ route: Route,
                        from sourceViewController: UIViewController?) -> Bool {

        // Optionally, filter out routes we don't support
        guard let appRoute = route as? AppRoute else { return false }

        // Check the requested enum, and perform the transition
        switch appRoute {
        case .viewController(let number):
            let newViewController = ViewController(number: number)
            sourceViewController?
                .navigationController?
                .pushViewController(newViewController, animated: true)
        }

        return true
    }
}

Using Objective-C associated objects, we can assign this router to any parent view controller that contains all of the view controllers that might want to perform these transitions:

let navigationController = UINavigationController(rootViewController: ViewController())
navigationController.router = AppRouter()

Finally, without any further modification to any of the child view controllers, they can start a transition by simply calling show() with the desired destination:

class ViewController: UIViewController {
    func moveToNewViewController() {
        show(AppRoute.viewController(number: 2))
    } 
} 

And that's the entire library! 🎉

Requirements

  • Swift 5
  • UIKit-compatible platforms (iOS, tvOS, Mac Catalyst)

Installation

Beeline is a very small framework, with all of its code contained in Router.swift. You can install it in the following ways:

Manual Installation

Drag the Beeline/Router.swift file into your Xcode project.

CocoaPods

pod 'Beeline'

SPM

You can add Beeline to an Xcode project by adding it as a package dependency.

https://github.com/TimOliver/Beeline

or, add the following to the dependencies in package.swift.

dependencies: [
  .package(url: "https://github.com/TimOliver/Beeline", from: "1.0.2")
]

Carthage

No plans to support Carthage at the moment, but please consider filing a PR if you would like it!

Credits

Beeline was built as a component of iComics 2 by Tim Oliver

License

Beeline is available under the MIT License. Please check the LICENSE file for more information.

About

An extremely lean implementation on the classic iOS router pattern.

Topics

Resources

Stars

Watchers

Forks

Contributors 3

  •  
  •  
  •