iOS的协调器模式
当视图控制器必须决定下一个屏幕要推送或显示的内容时,协调器(有时称为流管理器)是对常见问题的解决方案。 为了更清楚地了解这个常见问题,我们知道:
- UIViewControllers不应显示其他UIViewControllers。 视图控制器应该唯一的职责是呈现数据和捕获事件。
- 应该有一个单独的组件负责处理演示视图。 它负责流程逻辑,并从视图控制器中删除该职责
换句话说,如果您在视图控制器中的某处有这段代码(或类似的代码),则可能需要考虑使用此模式。
self.navigationController?.pushViewController(someViewController,动画:true)
当视图控制器本身决定将下一个视图控制器推入 self.navigationController
时,视图控制器将紧密耦合 。 使用这种方法,代码库将很难更改和维护,并且视图控制器几乎无法重用。
协调员可以轻松解决此问题
协调器负责管理一组视图控制器,它将负责流程逻辑(流程是一组具有类似用途(例如注册)的屏幕。 它处理导航流程,并负责创建和配置视图控制器。
使用协调器的主要优点是它可以帮助我们从视图控制器中消除这种责任。 这是处理UIViewControllers呈现的更优雅,更简洁的方法。 协调器负责创建导航控制器和任何子视图控制器。 然后,视图控制器是完全独立的,并且不了解使用它们的上下文,从而改善了可重用性和测试。
给我看一些代码
协调人协议:
所有协调员必须遵守协议:
协议协调员:类{
func start()
}
这使我们可以将协调器的初始化与开始工作分开。 它可以帮助我们根据需要创建它,并且只有在准备就绪时才能启动它。
公共类AuthCoordinator:协调器{
私人让navigationController:UINavigationController
公共init(navigationController:UINavigationController){
self.navigationController = navigationController
} public func start(){
如果登录{
showDashboard()
}其他{
showAuthentication()
}
}私人功能showDashboard(){
让dashboardViewController = DashboardViewController()
dashboardViewController.delegate = self self.navigationController.setViewControllers([dashboardViewController],动画:true)
}私人功能showAuthentication(){
让loginViewController = LoginViewController()
loginViewController.delegate =自我
self.navigationController.setViewControllers([loginViewController],动画:true)
}
}
因此,您刚刚看到了为应用程序创建协调器有多么容易。 Soroush对iOS平台的这种模式进行了很好的介绍。 这是他博客文章中的一段:
最终,协调员只是一种组织模式。 没有可用于协调器的库,因为它们是如此简单。 没有可以安装的pod,也没有可以继承的子集。 甚至没有真正符合的协议。 这不是使用弱点,而是使用像协调器这样的模式的优点:它只是您的代码,没有依赖项。
协调器非常易于使用和实现,它们对清理代码库产生巨大影响,并使视图控制器之间的耦合更加松散。
协调员Redux
应用协调员
- iOS5是否同时支持GL_STENCIL_INDEX和GL_STENCIL_INDEX8?
- 如何在不使用故事板的情况下创建通知内容扩展
- 无法在iOS 8上select联系人
- 如何检测NSString是否包含特定的字符?
- dyld:无法加载插入的库
- 为什么图书馆在C中很重要
- 使用NSFetchedResult控制器和每个月的部分标题
- NSFetchedResultsController不总是调用didChangeObject:atIndexPath:forChangeType:newIndexPath:for NSFetchedResultsChangeMove
- Xcode 8中的UITabbarController在故事板视图中显示一个蓝色矩形