Route
该路由器不保持任何状态,所有所需的导航值都是基于 UIViewController
属性动态计算的。它与现有的项目导航系统完全兼容。您可以轻松地将路由导航命令调用与执行 segue 或推送/呈现/删除等进行混合。因此,它可以在任何现有的项目中轻松添加。
特性
- 简单的导航命令
- 返回到包含结果的任何控制器
- 跳转到导航树中的任何控制器
- 对现有项目导航超级友好
- 可以无痛苦地添加到现有项目中
- 架构无关
- 轻量级
添加
提供路由器接入点(例如从视图控制器中)
extension UIViewController {
var router: Router {
return Router(window: UIApplication.shared.keyWindow, controller: self)
}
}
示例
使用
前进导航
投影控制器
let controller: UIViewController = ...
router.present(controller, animated: true, completion: { ... })
当前导航控制器中的推控制器
router.push(controller, animated: true, completion: { ... })
注意: completion 闭包在过渡完成后立即调用。
向后导航
返回任意控制器
router.back(
to: ViewController.self,
animated: true,
condition: { $0.id == 3 },
prepare: { controller in ... },
completion: { controller in ... }
)
除了目标控制器类型外,还提供条件,以防存在多个此类控制器在回退栈中。
返回上一个控制器
router.back(
animated: true,
prepare: { controller in ... },
completion: { controller in ... }
)
返回窗口根目录
router.backToWindowRoot(
animated: true,
prepare: { controller in ... },
completion: { controller in ... }
)
注意: prepare 关闭在过渡开始之前调用。这个关闭可以用来向目标控制器返回一些数据。
原地导航
替换当前控制器
router.replace(
with: controller,
animated: true,
completion: { ... }
)
注意: 替换包括根视图控制器。
设置当前窗口根视图控制器
router.setWindowRoot(
controller,
animated: true,
completion: { ... }
)
跳转到控制器
在导航树中,定位到任意位置的视图控制器。
router.jump(
to: ViewController.self,
animated: true,
condition: { $0.id == 3 },
prepare: { controller in ... },
completion: { controller in ... }
)
用户内容导航树信息
查找控制器
let controller = router.find(ViewController.self, condition: { $0.id == 3 })
俯视图控制器
let controller = router.topController
返回栈
从当前控制器到窗口根获取返回导航栈
let controllers = router.backStack
从根到顶级控制器栈
let controllers = router.topStack
自定义容器控制器
在导航树中的自定义容器控制器必须采用三种容器控制器协议之一。
简单容器
如果容器只有一个子控制器,它必须实现 ContainerController
协议(《示例》)。
堆栈容器
如果容器包含子控制器堆栈,如 UINavigationController
,则必须实现 StackContainerController
协议(示例)。
平面容器
如果容器中包含一个层次的子控制器,例如 UITabBarController
或 UIPageViewController
,它必须实现 FlatContainerController
协议。参见 标签控制器示例 或 页面控制器示例。
需求
- Swift 4.2+
- iOS 9.0+
安装
路由不包含任何外部依赖。
CocoaPods
将以下内容添加到 Podfile
pod 'Route'
手册
从源文件夹下载文件并将其拖入您的 Xcode 项目中。
许可
路由受以下协议的许可:[MIT 许可证](https://github.com/timonity/Route/blob/master/LICENSE)。