【发布时间】:2019-02-09 15:52:02
【问题描述】:
我的 iOS 应用中有一个 ViewController 流 (Flow A)。流程 A 相当复杂(根据情况,一些视图控制器会提前显示,或者根本不显示,等等)。为了处理这个问题,我使用了协调器模式。
代码(简化):
protocol Coordinator {
func start()
}
protocol FlowACoordinatable {
var coordinator: FlowACoordinator
}
class FlowACoordinator: Coordinator {
private var navigationController: UINavigationController
private var firstVC: FirstViewController
private var secondVC: SecondViewController
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
func start() { ... }
func present(_ viewController: (FlowACoordinatable & UIViewController)) {
viewController.coordinator = self
self.navigationController.pushViewController(viewController, animated: true)
}
...
}
class FirstViewController: UIViewController, FlowACoordinatable {
var coordinator: FlowACoordinator?
func buttonTapped() {
self.coordinator?.goToNextStep()
}
}
....
FlowACoordinator 包含有关如何以及何时使用present() 方法呈现视图控制器的逻辑。到目前为止一切顺利。
现在我有第二个流程Flow B,与流程A 大不相同。除了我想在两者之间共享一个视图控制器,我们称之为SharedViewController。这就是事情变得奇怪的地方,因为我不知道如何在两者之间共享这个视图控制器。
问题:我有两种方式的通信 - 协调器将自己设置为它呈现的视图控制器的协调器,并且视图控制器调用协调器上的方法作为对用户交互的响应。 SharedViewController 由两个 Coordinator 之一管理,并且它必须以某种方式将信息传递给当前的 Coordinator,不管它是哪一个。
到目前为止,我找到了两个解决方案,它们都不令人满意:
一个额外的协调器只处理
SharedViewController- 这是很多开销并且很大程度上违背了协调器的目的。在
SharedViewController中实现FlowACoordinatable、FlowBCoordinatable、...,并具有多个协调器属性并在适当的时候调用它们。还有很多开销、样板代码和对协调器的调用。
关于如何很好地解决这个问题的任何想法?
【问题讨论】:
标签: ios swift design-patterns coordinator-pattern