iOS中的协调器模式

我最近遇到了Soroush Khanlou的Coordinator模式讨论,并决定在他的博客上阅读更多内容:http://khanlou.com/2014/09/8-patterns-to-help-you-destroy-massive-view-controller/但它变得非常混乱,我研究并经历了人生,直到我终于明白了! 这种模式可以帮助我们正常地在应用程序内管理从一个视图到另一个视图的导航。 我确定您已经看过几次此代码

   vc = ViewController() 
vc.object = NSObject()
自我 .navigationController?.pushViewController(vc,动画: true

但不是! 这仅表示子控制器正在告诉父控制器显示,这是您的不尊重吗?

这种设计coordinator pattern将有助于将其他viewController的表示coordinator pattern封装到一个单独的对象中。 Soroush并不是唯一讨论这种将导航职责移到视图控制器之外的模式的iOS开发人员。 在标题下可以找到其他几篇文章:Krzysztof Zablocki,Alberto Debortoli等人讨论的流量控制器

我将直言不讳,因为无需解释Soroush如何提出这种模式的故事。 您在这里看到集成有多么容易,以及是否想采用它。

PS:我自己对协调器模式的实现可能与您之前看到的有所不同,因为每个人都只是使用对他们有用的东西

假设我们正在构建具有以下功能的应用程序

  1. 认证方式
    一世。 登录
    ii。 注册
  2. 轮廓

请注意,这些都是功能,而不是控制器。 重要的是要注意,每个功能都可以在其下具有多个控制器,并具有一个协调器来处理它们之间的导航。

现在让我们开始吧! 首先,我们需要创建我们的基本协调器协议。 它看起来像这样

  协议协调员:类{ 
  var childCoodinators:[协调员] { 获取 设置 } 
  var navigationController:UINavigationController { 获取 设置 } 
  func start() 
  } 

您需要了解协议如何快速工作。 这是一篇可以使您快速入门的文章。https://www.hackingwithswift.com/read/24/3/protocol-oriented-programming-for-beginners。

现在,我们需要创建主要协调员,就像您已经看到的那样,它将是所有其他协调员的父亲。 它将孕育所有其他协调员并负责管理它们。

maincoordinator继承了Coordinator协议,这意味着它必须实现Coordinator协议的属性,start方法的实现将推动引擎,您将在我们的其他协调器中看到这种模式。

现在您可能会问“我如何使用它来启动我的应用程序?”。 让我们跳到AppDelegate来设置我们的窗口以启动maincoordinator。

  1. 声明MainCoordinator的可选实例
  var mainCoordinator:MainCoordinator? 

2.由于我们要以编程方式说明其初始视图,因此我们需要手动设置窗口

这将使用Home或Login viewController启动应用程序的窗口,具体取决于用户是否登录。 现在,让我们假设该应用程序是从Login Controller启动的,我们如何迁移到HomeController?

创建一个名为HomeCoordinator的新协调HomeCoordinator该协调HomeCoordinator将保存家庭功能中及其内部的所有导航。

HomeCoordinator也将从Coordinator协议继承,这意味着它将具有Coordinator协议的所有属性,并且看起来像上面的MainCoordinator。

现在,我们需要一种允许“父亲”主协调员与其他协调员通信的方法。 创建一个新协议,并将其MainCoordinatorProtocol

妥善遵守所有协议……这已经超出了我的预期,我们将在本文的第二部分继续进行,谢谢。