Awesome
SwiftRouter
A URL Router for iOS, written in Swift, inspired by HHRouter and JLRoutes.
Installation
SwiftRouter Version | Swift Version | Note |
---|---|---|
Before 1.0.7 | 2.0 | n/a |
1.0.7 | 2.2 | n/a |
2.0.0 | 3.0 | n/a |
2.1.0 | 3.0 | Breaking changes by adopting exception |
3.0.0 | 4.0 | @objc should be used with properties |
Carthage
SwiftRouter is compatible with Carthage. Add it to your Cartfile
:
github "skyline75489/SwiftRouter"
CocoaPods
pod 'JLSwiftRouter'
use_frameworks!
Manually
Add SwiftRouter.swift
in your project.
Usage
Routing ViewController
Define properties in your custom ViewController:
class UserViewController: UIViewController {
@objc var userId:String?
@objc var username:String?
@objc var password:String?
}
Map URL to ViewController:
import SwiftRouter
let router = Router.shared
router.map("/user/:userId", controllerClass: UserViewController.self)
Get instance of ViewController directly from the URL. Parameters will be parsed automatically:
let vc = router.matchController("/user/1?username=hello&password=123")!
XCTAssertEqual(vc.userId, "1")
XCTAssertEqual(vc.username, "hello")
XCTAssertEqual(vc.password, "123")
This will load controller using init() method. If you want to load view controller from storyboard - use:
let vc = router.matchControllerFromStoryboard("/user/1?username=hello&password=123",
storyboardName: "MyStoryboard")!
This code will load controller from storyboard named MyStoryboard.storyboard. Just don't forget to set that controller identifier in storyboard to its class name. In this case UserViewController
.
Push custom ViewController:
router.routeURL("/user/123", navigationController: self.navigationController!)
// The custom ViewController will be pushed with parameters.
Routing handler
Define your custom handler function and map it to URL:
router.map("/user/add", handler: { (params:[String: String]?) -> (Bool) in
XCTAssertNotNil(params)
if let params = params {
XCTAssertEqual(params["username"], "hello")
XCTAssertEqual(params["password"], "123")
}
return true
})
Call the handler from router:
router.routeURL("/user/add?username=hello&password=123")
// The handler function will be called with parameters.