一旦您将您的 UIViewController
实现为 Routable
,您可以用它们在 url 方案路由中表示的参数进行注册。然后 IKRouter
可以为您创建一个 UIViewController
数组,以便在处理有效 URL 时显示。您所要做的就是显示它们!
IKRouter
还可以通过简单地注册一个路由并使用函数/闭包来处理它来按传统方式处理路由。这两种方法也可以同时使用。
一个示例路由是
myapp://project/:projectId/item/:itemId
注意,路由必须包含方案(myapp://
),URL 参数需要以冒号(:
)为前缀,并且在注册路由时不包括查询字符串,因为当匹配路由时它们是包含的。
为了使用 Routables 自动创建您的 UI 栈
UIViewController
符合 Routable
。IKRouter
实例。routableHandler
闭包/函数处理 UIViewController
链。Routable
协议由一个简单的方法组成,该方法在给定一个 MatchedRoute
时返回 Routable
的一个实例。
protocol Routable {
static func instanceForRoute(route: MatchedRoute) -> Routable?
}
MatchedRoute
实例提供了所有通过到 Routables
传递所需的信息,如匹配的参数及其值以及查询字符串。
一旦您的 UIViewController
是 Routable
,只需做以下操作
let navController = UINavigationController()
let router = IKRouter()
router
.registerRoutableWithParameter(ProjectViewController.self, parameter: ":projectId")
.registerRoutableWithParameter(ItemViewController.self, parameter: ":itemId")
.registerRouteHandler("myapp://project/:projectId/item/:itemId")
.registerRouteHandler("myapp://project/:projectId")
.routableHandler = { match, viewControllers in
navController.setViewControllers(viewControllers, animated: true)
}
Routable
,就可以在任何组合中注册尽可能多的路由。Routable
Routable
,将使用默认处理程序(如果提供)handler
参数。当使用 Routable
时可以省略它。如果您有的路由可能不适合由 Routable
提供的 自动 功能,您还可以注册具有自己的处理器的单独路由。
let router = IKRouter()
router
.registerRouteHandler("myapp://project/:projectId/item/:itemId") { match in
//create view controllers and show here...
return true
}
.registerRouteHandler("myapp://project/:projectId/users/:userId") { match in
//create view controllers and show here...
return true /* return false if we didn't handle the route */
}
注意:此处使用的是每个路由的处理程序(与上面不同)
每个应用程序都有略微不同的 UI 层次结构/架构……因此,IKRouter
不提供 UIViewController
展示的自动处理,而是允许您自己处理。相反,我提供了一种 UINavigationController
扩展,您可以使用它以不同方式显示堆栈。
目前有一个简单的方法,可以取一个 UIViewController
堆栈;推送除最后一个以外的所有项,并以如下方式 展示 堆栈中的最后一个项:
router.routableHandler = { match, viewControllers in
navController.setViewControllersPresentingLast(viewControllers, animatedSet: true, animatedPresent: true)
}
如果您认为有其他展示堆栈的方式,会很有用,请随时添加问题或拉取请求,两者都欢迎!
或通过将 IKRouter 子文件夹中的源文件手动添加到项目中。
这里包含了一个应用程序,您可以用它来看到它在操作中的样子。