/MK2Router

Primary LanguageSwiftMIT LicenseMIT

MK2Router

MK2Router is a view controller routing utility for Swift.

See also: Qiita(Japanese) http://qiita.com/imk2o/items/8a46cfeaede7cbba4dcb

Requirements

  • iOS 8.0+
  • Xcode 8.0+
  • Swift 3.0

Install

CocoaPods

Add the following line to your Podfile.

pod 'MK2Router', '~> 2.4.0'

Run pod install and open your Xcode workspace.

Usage

The DestinationType protocol

The DestinationType protocol indicates that the routable destination view controller. Declare typealias Context that the required parameter type for routing.

class ItemDetailViewController: UIViewController, DestinationType {
  typealias Context = Int

  ...
}

The UIViewController#context property refers to passed parameters.

override func viewDidLoad() {
    super.viewDidLoad()

    let itemID: Int = self.context
}

Routing with segue

The UIStoryboardSegue extension provides passing parameters between view controllers.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    segue.mk2.context(ifIdentifierEquals: "ShowDetail") { (destination: ItemDetailViewController) in
        guard
            let indexPath = self.tableView.indexPathForSelectedRow,
            let selectedItem = self.items?[indexPath.row]
        else {
            fatalError()
        }

        return selectedItem.ID
    }
}

Manual routing

The Router class provides some instance methods. The following example is present a ItemDetailViewController that instantiates with Main storyboard's ItemDetailNav layout.

Router.shared.perform(
    sourceViewController,
    storyboardName: "Main",
    storyboardID: "ItemDetailNav"
) { (destination: ItemDetailViewController) -> Int in
    return itemID    // pass the seleted item ID
}

Variant Context

If you want the DestinationType.Context equips variant type, use enum type as context.

class ItemDetailViewController: UIViewController, DestinationType {
    enum ContextType {
        case itemID(Int)
        case item(Item)
    }
    typealias Context = ContextType

    ...

Feedback with unwind segue

If you want to feedback values to source view controller using unwind segue, do as follows.

  • Store the feedback values when unwind (in destination view controller)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    segue.mk2.feedback(ifIdentifierEquals: "Unwind") { (source: SearchOptionViewController) in
        return self.keywordTextField.text ?? ""
    }
}
  • Get the feedback values (in source view controller)
@IBAction func unwindFromSearchOption(_ segue: UIStoryboardSegue) {
    if let keyword = segue.mk2.feedback(from: SearchOptionViewController.self) {
        self.loadItems(keyword: keyword)
    }
}

License

The MIT License.