MK2Router
MK2Router 是一个用于Swift的视图控制器路由实用工具。
另请参阅:Qiita(日语) http://qiita.com/imk2o/items/8a46cfeaede7cbba4dcb
要求
- iOS 8.0+
- Xcode 8.0+
- Swift 3.0
安装
CocoaPods
请在您的Podfile
中添加以下行。
pod 'MK2Router', '~> 2.4.0'
运行pod install
并打开您的Xcode工作空间。
使用
DestinationType 协议
DestinationType
协议表示可路由目的地视图控制器。声明 typealias Context
来指定路由所需参数的类型。
class ItemDetailViewController: UIViewController, DestinationType {
typealias Context = Int
...
}
UIViewController#context
属性指的是传递的参数。
override func viewDidLoad() {
super.viewDidLoad()
let itemID: Int = self.context
}
使用 segue 进行路由
UIStoryboardSegue
扩展提供了在视图控制器之间传递参数的功能。
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
}
}
手动路由
Router
类提供了一些实例方法。以下示例显示了使用 Main
工程簿的 ItemDetailNav
布局创建的 ItemDetailViewController
。
Router.shared.perform(
sourceViewController,
storyboardName: "Main",
storyboardID: "ItemDetailNav"
) { (destination: ItemDetailViewController) -> Int in
return itemID // pass the seleted item ID
}
变异上下文
如果想要 DestinationType.Context
配备变异类型,请使用 enum
类型作为上下文。
class ItemDetailViewController: UIViewController, DestinationType {
enum ContextType {
case itemID(Int)
case item(Item)
}
typealias Context = ContextType
...
使用 unwind segue 进行反馈
如果想要使用 unwind segue 将值反馈给源视图控制器,按以下操作。
- 在 unwind(目标视图控制器)时存储反馈值。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
segue.mk2.feedback(ifIdentifierEquals: "Unwind") { (source: SearchOptionViewController) in
return self.keywordTextField.text ?? ""
}
}
- 在源视图控制器中获取反馈值。
@IBAction func unwindFromSearchOption(_ segue: UIStoryboardSegue) {
if let keyword = segue.mk2.feedback(from: SearchOptionViewController.self) {
self.loadItems(keyword: keyword)
}
}
许可证
MIT许可证。