使用 Swift PM 的最简单的方式是找到 Project Setting -> Swift Packages 并将 FJRouter 添加在其中。 搜索
https://github.com/zgjff/FJRouter并
在你的 Podfile 文件中添加 FJRouter:
pod 'FJRouter'然后运行 pod install。
1: 当路由路径比较复杂,且含有参数的时候, 如果通过硬编码的方法直接手写路径, 可能会造成拼写错误,参数位置错误等
2: 在实际app中, 路由的
URL格式可能会随着时间而改变, 但是一般路由名称不会去更改
设置路由的名称之后, 后续的跳转均可以通过name进行。
路径
/family/:fid, 可以匹配以/family/...开始的url, eg:/family/123,/family/456and etc.
路径
/user/:id/book/:bookId, 可以解析出参数分别需要id, bookId, 可以匹配/user/../book/...的url, eg:/user/123/book/456and etc.
/// 是否需要重定向
func needRedirect(state: FJRouterState) async -> Bool
/// 指向需要重定向的路由。
///
/// 可以携带参数.eg, 目标路由是`/family/:fid`, 则需要完整传入`fid`, 即`/family/123`
func redirectRoute(state: FJRouterState) async -> String框架已经提供了一个通用的拦截器实现FJRouteCommonInterceptor
路由的显示逻辑displayAction: 一般用于匹配成功之后, 非自己调用push,present等自主操作行为。用于go(location: String......)等以go开头的跳转方法。 在这里可以随意的指定此路由对应控制器的配皮显示逻辑。eg:
push
displayAction: { sourceController, destController, state in
sourceController.navigationController?.pushViewController(viewController, animated: true)
}present
displayAction: { sourceController, destController, state in
matchController.modalPresentationStyle = .fullScreen
sourceController.present(viewController, animated: true)
}
设置app的rootViewController
```swift
displayAction: { sourceController, destController, state in
UIApplication.shared.keyWindow?.rootViewController = matchController
}自定义转场动画
displayAction: { sourceController, destController, state in
matchController.modalPresentationStyle = .custom
matchController.transitioningDelegate = xxx
sourceController.present(matchController, animated: true)
}甚至可以不用跳转至新控制器。如在观察到当前控制器与路由匹配到的是同一个控制器的情况下, 不跳转新的, 而是刷新当前的控制器内容
displayAction: { sourceController, destController, state in
if type(of: sourceController) == type(of: destController) {
sourceController.update(with: xxxxx)
}
}注意: 强烈建议子路由的
path不要以/为开头
let route = try! FJRoute(path: "settings", builder: ..., routes: [
try! FJRoute(path: "user", builder: ...),
try! FJRoute(path: "pwd", builder: ...),
try! FJRoute(path: "info/:id", builder: ...),
])通过构建路由FJRoute对象进行注册:
FJRouter.shared.registerRoute(route: FJRoute)直接通过路由path进行注册:
FJRouter.shared.registerRoute(path: String, ...)FJRouter.shared.setRedirectLimit(50)FJRouter.shared.setErrorBuilder { state in
return UIViewController()
}强烈建议跳转的时候使用以goNamed、pushNamed、presentNamed为前缀的方法进行跳转
1: 当路由路径比较复杂,且含有参数的时候, 如果通过硬编码的方法直接手写路径, 可能会造成拼写错误,参数位置错误等
2: 在实际app中, 路由的
URL格式可能会随着时间而改变, 但是一般路由名称不会去更改
FJRouter.shared.goNamed("login")
FJRouter.shared.pushNamed("login")
FJRouter.shared.presentNamed("login")会优先调用路由的
displayAction方法; 若是displayAction为nil, 框架内部会先尝试push, 然后尝试present
FJRouter.shared.go(location: "/login")
FJRouter.shared.goNamed("user", params: ["id": "123"])FJRouter.shared.push(location: "/login")
FJRouter.shared.pushNamed("user", params: ["id": "123"])FJRouter.shared.present(location: "/login")
FJRouter.shared.presentNamed("user", params: ["id": "123"])