Direct 1.6

Direct 1.6

Maintained by Igor Matyushkin.




Direct 1.6

  • By
  • Igor Matyushkin

Direct

Direct

Simplifies transitions between screens in iOS app.

How To Get Started

  • Copy content of Source folder to your project.

or

  • Use Direct cocoapod

Requirements

  • iOS 9 and later
  • Xcode 9 and later
  • Swift 4

Usage

Preparations

Create extension for Scene class:

extension Scene {
    
    static var main: Scene {
        let navigationController = UINavigationController()
        navigationController.viewControllers = [
            MainViewController(nibName: "MainViewController", bundle: nil)
        ]
        return Scene(rootController: navigationController)
    }
    
}

Change AppDelegate.swift:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    Navigator.shared
        .createWindow()
        .setScene(.main)
    
    return true
}

Also, remove reference to window (var window: UIWindow?) from AppDelegate class.

Window

With Navigator class you can create window in one line of code:

Navigator.shared.createWindow()

If you have a custom window class, it's possible to use it too:

Navigator.shared.createWindow(ofType: MyWindow.self)

It's recommended to use createWindow() method in AppDelegate (see example in Preparations section).

Usually, Xcode creates AppDelegate class with a reference to UIWindow inside:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
}

With Navigator you don't need to keep this reference, so you can remove it from AppDelegate class. Use Navigator.window instead.

Scenes

Scene describes navigation stack including root controller. Here's an example:

let navigationController = UINavigationController()

navigationController.viewControllers = [
    MyViewController(nibName: "MyViewController", bundle: nil)
]

let scene = Scene(rootController: navigationController)

It's highly recommended to create extension for Scene class and provide static variables describing new scenes like it's done in Preparations section.

Switching between scenes is simple:

Navigator.shared.setScene(newScene)

Transitions

Transition is an action that is performed with stack of navigation controller, for example: pushing, presenting, dismissing view controllers, etc. Below you can find list of examples how to manage navigation stack with Direct library.

Push view controller:

let someViewController = SomeViewController(nibName: "SomeViewController", bundle: nil)
Navigator.shared.performTransition(.push(viewController: someViewController, animated: true))

Pop:

Navigator.shared.performTransition(.pop(animated: true))

Pop to root view controller:

Navigator.shared.performTransition(.popToRootViewController(animated: true))

Present:

Navigator.shared.performTransition(.present(viewController: someViewController, animated: true, completion: {
}))

Dismiss:

Navigator.shared.performTransition(.dismiss(animated: true, completion: {
}))

Access to current navigation controller:

if let currentNavigationController = Navigator.shared.scene?.rootNavigationController {
    // Do something with current navigation controller
}

Syntax

Navigator supports call chains so you can write long expressions:

Navigator.shared
    .createWindow()
    .setScene(.main)
    .performTransition(.push(viewController: someViewController, animated: false))
    .performTransition(.present(viewController: popupViewController, animated: true, completion: {
    }))

License

Direct is available under the MIT license. See the LICENSE file for more info.