iOS:Swift中的协调器模式

您是否曾经遇到过这样的情况,即您的viewController变得如此紧密并相互依赖。 您的导航分散在您的所有代码中。

您可能还听说过Massive视图控制器问题。 这与以下事实有关:MVC模式的视图控制器通常会做过多的工作,包括视图设置代码本身。 以某种方式使视图控制器实际上变成一个视图(还有更多…)

视图控制器不应该执行的任务之一。 屏幕导航管理和应用程序流程。

什么是协调器模式?

Soroush Khanlou在2015年NSSpain会议上介绍给iOS社区。Coordinator模式提供了导航逻辑的封装。

换句话说:而不是从其他视图控制器推送和呈现ViewController。 所有屏幕导航将由协调员管理。

因此,视图控制器将被隔离并且彼此不可见 ,并且可以轻松地重用

如上图所示。 协调器模式可以通过以下方式描述:

  • 我们可能有一个协调员一个或多个视图控制器。
  • 每个协调器都使用通常称为“ start ”的方法显示其viewController。
  • 每个viewController都有一个对其协调器的委托引用。
  • 每个协调员都有一系列协调员。
  • 每个子协调器都有对其父级的委托引用。

让我们继续练习。

重要提示:您可能会发现以下示例与其他实现略有不同。 这就是我个人使用它的方式。 但是主要机制在任何地方都是相同的。

在这里,我们将有两个协调器管理三个视图控制器,以表明一个协调器可以具有一个或多个视图。

快速创建一个新的单视图项目。 具有三个视图控制器:FirstViewController,SecondViewController和ThirdViewController。

在每个视图控制器上,添加一个按钮以导航到以下视图控制器。

首先,我们将创建一个协调器协议。 通过一个子协调器数组和一个初始化方法,该方法接收导航控制器作为参数。

然后是第一个协调器,它将管理第一个视图控制器。
使用start方法实现,将第一个视图控制器添加到导航控制器中。

firstCoordinator有两个扩展,一个用于导航到下一个viewController。 第二个是导航回第一个协调器。

我们需要保持子协调器数组与当前协调器堆栈更新。

然后,不要直接在didfinishlaunchingwithoptions方法中创建主控制器。 我们使用主navigationController作为参数创建了第一个协调器。 并且start方法将负责显示第一个viewController。

现在为了导航到下一个viewController。 我们将不得不致电协调员。 由FirstViewControllerDelegate表示。

正如先前所说。 协调者可以管理一个或多个viewController。 因此,在这里,secondCoordinator将同时处理第二个和第三个viewControllers。

首先,我们创建一个自定义的后退按钮,调用一个协调器方法navigationToFirstpage

重要说明 :在协调器之间切换时。 如果未覆盖操作,则默认的导航控制器后退按钮将中断协调器逻辑 。 我们应该绝对使用协调器方法调用自己的后退操作,以确保子协调器数组得到正确更新

然后我们使用另一个方法转到ThirdViewController:

最后,ThirdViewController调用其委托(SecondCoordinator)导航到FirstViewController。 此处无需覆盖navigationController后退按钮,因为它不会更改当前协调器。

这样,我们就可以进行循环导航:firstViewController-> secondViewController-> thirdViewController。

在这里您可以下载完整的源代码项目

在这里,我们能够使用协调器层在控制器之间导航,而在其他视图控制器中没有任何引用。 同时将导航逻辑移至协调器。
这将有助于减少大量视图控制器的影响。

谢谢您的阅读!