测试已测试 | ✓ |
Lang语言 | SwiftSwift |
许可证 | Apache 2 |
发布上次发布 | 2015年4月 |
SPM支持 SPM | ✗ |
由 Rafael Lopez Diez 维护。
如果您想遵守面向对象的单一职责原则,您的视图控制器就不 nên 负责处理应用中的导航流程。
RLDNavigationSwift
是一组 Swift 类,允许您使用导航命令对象来解耦导航和视图控制器,从而定义应用的可能导航流程。
它使用广度优先搜索实现路由,以解决复杂路径。它还可以防止导航循环,如 A > B > C > B
。包含一个示例应用。
也可用 Objective-C 版本。
最简单的设置涉及为您的应用中每个 destination
视图控制器子类化 RLDPushPopNavigationCommand
,定义可行的流程以及如何初始化它,通过对这些类变量进行重写。
class var origins:[String]?
class var destination:String?
class var viewControllerStoryboardIdentifier:String?
class var nibName:String?
您应该在 origins
中返回一个数组,包含所有可以导致位于 destination
中导航命令引用的视图控制器类。如果您返回一个空数组或 nil
,则 destination
视图控制器类将可从我而任意的视图控制器访问。
如果您的导航命令没有提供 viewControllerStoryboardIdentifier
和 nibName
,则视图控制器将通过直接分配初始化。
您可以通过子类化 RLDNavigationCommand
来实现更高级的导航命令。
为了找到最合适的导航命令,使用 RLDNavigationCommandFactory
。您需要通过使用它们的 registerCommandClass()
类函数将自定义创建的导航命令注册到工厂,以使它们可用。
确保所有类在需要时都已就绪的最好方法是在同一位置注册它们。您可以使用注册类和一些函数,这些函数在应用启动完成后调用一次。包含的示例应用就是使用这种方法
import Foundation
class RLDNavigationCommandRegistrar {
static var onceToken: dispatch_once_t = 0
class func registerAvailableNavigationCommands() {
dispatch_once(&onceToken) {
RLDMenuNavigationCommand.registerCommandClass()
RLDFolderNavigationCommand.registerCommandClass()
RLDConnectionsNavigationCommand.registerCommandClass()
RLDProfileNavigationCommand.registerCommandClass()
RLDChatNavigationCommand.registerCommandClass()
RLDContactCardViewModelNavigationCommand.registerCommandClass()
}
}
}
注册所需的所有导航命令后,您可以轻松地在不同的视图控制器之间导航
self.goTo("classNameOfDestination")
如果您需要在导航完成时收到通知,可以使用完成闭包,如下所示
self.goTo("classNameOfDestination",
completionClosure:{
// This will be executed once the navigation has taken place
})
如果您需要传递参数或者在导航到视图控制器时自定义它们,您可以指定一个属性字典,并且KVC将会尝试设置导航链中每个新实例化的视图控制器的所有属性。
例如,在这个示例中,当进行导航时,如果有三个视图控制器被推送,它们的userName
属性都将被设置为John Doe
。如果任何一个视图控制器没有这个属性,或者它是只读的,那么它将被忽略
self.goTo("classNameOfDestination",
properties:["userName":"John Doe"])
您可以通过指定必须先到达的中间目的地来覆盖完全自动的流量计算流程。在必要时,会沿着这些里程碑之间的自动路径进行。
self.goTo("classNameOfDestination",
properties:["userName":"John Doe"],
breadcrumbs:["firstIntermediateClassName", "secondIntermediateClassName"])
面包屑可以帮助您创建复杂的路线,并且也是替换类似URL的导航定义的一种有帮助的方式。
您应该考虑使用视图模型而不是暴露视图控制器类,这是一个更干净、更灵活且强类型的传递配置参数的方式。如果您应用程序不是按这种方式构建的,这可能需要您多付出一些努力,但从长远来看可能会得到回报。您可以在附带的应用程序中找到如何使用RLDNavigationSwift
以及视图模型的方法
// RLDMenuViewController
@IBAction func contactCardTapped() {
let viewModel = RLDContactCardViewModel(name:"John", surname:"Doe", email:"[email protected]")
RLDNavigationSetup(
viewModel:viewModel,
navigationController:navigationController!).go()
}
在不使用类似URL的导航方案的情况下,您可以使用RLDNavigationSwift
轻松实现它。只需在RLDNavigationSetup
上创建一个分类,并实现一个工厂方法将URL组件转换为面包屑,并最终将最终查询转换为属性。您可以在附带的应用程序中找到一个基本的示例
// RLDMenuViewController
@IBAction func contactCardTapped() {
let viewModel = RLDContactCardViewModel(name:"John", surname:"Doe", email:"[email protected]")
RLDNavigationSetup(
viewModel:viewModel,
navigationController:navigationController!).go()
}
Classes
下所有的文件添加到您的项目中。RLDNavigationSwift
受Apache License,版本2.0许可。有关更多信息,请参阅LICENSE文件。
此README是用(GitHub-Flavored) Markdown Editor制作的