Swift Flow 的声明式路由器。允许开发者以类似于网络上使用 URL 的方式声明路由。
使用 Swift Flow Router,您可以通过定义类似于 URL 的标识符序列形式的目标位置来在应用程序中进行导航。
mainStore.dispatch(
SetRouteAction(["TabBarViewController", StatsViewController.identifier])
)
Swift Flow Router 仍在开发中,并且 API 在此阶段既不完整也不稳定。
当使用 Swift Flow 开发应用程序时,您应该旨在通过操作来触发所有状态变化 - 这包括导航状态的变化。
这需要在应用程序状态中存储当前的导航状态并使用操作来触发对该状态的更改 - 这两者都由 Swift Flow Router 提供。
通过遵守 HasNavigationState
协议并将 navigationState
成员添加到您的应用程序状态中,扩展您的应用程序状态以包括导航状态
import SwiftFlowRouter
struct AppState: StateType, HasNavigationState {
// other application state
var navigationState = NavigationState()
}
初始化您的 store 后,创建一个 Router
的实例,传入 store 的引用和根 Routable
router = Router(store: mainStore, rootRoutable: RootRoutable(routable: rootViewController))
我们将在下一节中讨论 Routable
。
Routable
Swift Flow Router 与定义路由的工作方式相似,就像 URL 一样,是一个标识符序列,例如 ["Home", "User", "UserDetail"]
。
Swift Flow Router 对您所使用的 UI 框架是透明的 - 它使用 Routable
来实现该交互。
每个路由段映射到一个负责的 Routable
。该 Routable
需要能够呈现一个子视图、隐藏一个子视图或将一个子视图替换为另一个子视图。
以下是包含您应实现的方法的 Routable
协议
protocol Routable {
func changeRouteSegment(from: RouteElementIdentifier,
to: RouteElementIdentifier,
completionHandler: RoutingCompletionHandler) -> Routable
func pushRouteSegment(routeElementIdentifier: RouteElementIdentifier,
completionHandler: RoutingCompletionHandler) -> Routable
func popRouteSegment(routeElementIdentifier: RouteElementIdentifier,
completionHandler: RoutingCompletionHandler)
}
作为初始化 Router
的一部分,您需要将第一个 Routable
作为参数传递。这个根 Routable
将负责第一个路由段。
例如,如果将应用程序的路由设置为 ["Home"]
,则根 Routable
将被要求呈现与标识符 "Home"
对应的视图。
当使用 UIKit 进行 iOS 开发时,这意味着该 Routable
需要设置应用程序的 rootViewController
。
每当一个路由接口
提供一个新的路由段时,它需要返回一个新的路由接口
,该接口将负责管理提供的段。如果您想从["主页"]
导航到["主页", "用户"]
,则负责"主页"
段的路由接口
将被要求提供"用户"
段。
如果您的导航堆栈使用模态呈现进行此转换,"主页"
段的Routable
实现可能如下所示
func pushRouteSegment(identifier: RouteElementIdentifier,
completionHandler: RoutingCompletionHandler) -> Routable {
if identifier == "Home" {
// 1.) Perform the transition
userViewController = UIStoryboard(name: "Main", bundle: nil)
.instantiateViewControllerWithIdentifier("UserViewController") as! Routable
// 2.) Call the `completionHandler` once the transition is complete
presentViewController(userViewController, animated: false,
completion: completionHandler)
// 3.) Return the Routable for the presented segment. For convenience
// this will often be the UIViewController itself.
return userViewController
}
// ...
}
func popRouteSegment(identifier: RouteElementIdentifier,
completionHandler: RoutingCompletionHandler) {
if identifier == "Home" {
dismissViewControllerAnimated(false, completion: completionHandler)
}
// ...
}
Swift Flow Router需要限制导航操作,因为包括UIKit在内的大多数UI框架都不允许并行执行多个导航步骤。因此,每个Routable
方法都接收一个completionHandler
。路由器将在完成处理程序被调用之前不会执行任何进一步的导航操作。
目前更改当前应用路由的唯一方式是使用SetRouteAction
并提供一个绝对路由。以下是一个简略的示例
@IBAction func cancelButtonTapped(sender: UIButton) {
mainStore.dispatch(
SetRouteAction(["TabBarViewController", StatsViewController.identifier])
)
}
随着开发的继续,将添加对更改单个路由段的访问。