SwiftFlowRouter 0.2.2

SwiftFlowRouter 0.2.2

测试已测试
语言语言 SwiftSwift
许可协议 MIT
发布日期最新版本2016年1月
SPM支持 SPM

Benjamin Encz 维护。



Swift Flow 的声明式路由器。允许开发者以类似于网络上使用 URL 的方式声明路由。

使用 Swift Flow Router,您可以通过定义类似于 URL 的标识符序列形式的目标位置来在应用程序中进行导航。

mainStore.dispatch(
    SetRouteAction(["TabBarViewController", StatsViewController.identifier])
)

关于 Swift Flow Router

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)
    }

    // ...
}

在Routables中调用完成处理程序

Swift Flow Router需要限制导航操作,因为包括UIKit在内的大多数UI框架都不允许并行执行多个导航步骤。因此,每个Routable方法都接收一个completionHandler。路由器将在完成处理程序被调用之前不会执行任何进一步的导航操作。

更改当前路由

目前更改当前应用路由的唯一方式是使用SetRouteAction并提供一个绝对路由。以下是一个简略的示例

@IBAction func cancelButtonTapped(sender: UIButton) {
    mainStore.dispatch(
        SetRouteAction(["TabBarViewController", StatsViewController.identifier])
    )
}

随着开发的继续,将添加对更改单个路由段的访问。