【问题标题】:How to pass a value from second view controller to first view controller through coordinator pattern如何通过协调器模式将值从第二个视图控制器传递到第一个视图控制器
【发布时间】:2019-11-25 10:14:14
【问题描述】:

我想在我的 iOS 应用程序中使用 Soroush Khanlou 协调器模式 (http://khanlou.com)。我的问题是如何通过协调器将数据传递回我的第一个视图控制器? 在使用协调器模式之前,我使用委托(协议)将数据从第二个视图控制器传递回第一个视图控制器,因为我的第一个视图控制器负责创建和呈现第二个视图控制器,这不是一个好的解决方案。所以我决定使用协调器 从我的视图控制器中删除应用程序导航的工作。 这是场景:

class FirstViewController: UIViewController {
    weak var coordinator: MainCoordinator?

    func showSecondViewController(data: Data) {
    coordinator?.presentSecondViewController(data: data) {[weak self] in
        guard let self = self else { return }
        //Do something
    }
}


class MainCoordinator: NSObject, Coordinator {

    var childCoordinators = [Coordinator]()
    var navigationController: UINavigationController

    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }

    func start(completion: (() -> Void)?) {
        navigationController.delegate = self
        let firstViewController = FirstViewController.instantiate()
        firstViewController.coordinator = self
        navigationController.pushViewController(firstViewController, animated: false)
    }

    func presentSecondViewController(data: Data, completion: @escaping () -> Void) {
        let child = SecondCoordinator(data: data, navigationController: navigationController)
        childCoordinators.append(child)
        child.parentCoordinator = self
        child.start() {
            completion()
        }
    }

    func refresh(data: SomeDataType) {
        //data from second view controller is here but I don't know how to pass it to my first view controller
        //there is no reference to my first view controller 
        //what is the best way to pass data back?
    }
}



class SecondCoordinator: Coordinator {

    weak var parentCoordinator: MainCoordinator?
    var childCoordinators = [Coordinator]()
    var navigationController: UINavigationController
    var data: Data!

    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }

    convenience init(data: Data, navigationController: UINavigationController) {
        self.init(navigationController: navigationController)
        self.data = data
    }

    func start(completion: (() -> Void)?) {
        let vc = SecondViewController(data: data)
        vc.coordinator = self
        vc.delegate = self. //here I used delegate to get data from second view controller to pass it to first view controller
        navigationController.present(vc, animated: true) {
            completion!()
        }
    }
}

extension SecondCoordinator: SecondViewControllerDelegate {
    func refresh(data: SomeDataType) {
        parentCoordinator?.refresh(data: data) // I need to pass this data to my first view controller
    }
}

【问题讨论】:

  • 我猜你需要委托模式
  • 在第二个中使用两个闭包,在协调器中使用另一个闭包将值传递给 firstViewcontroller
  • @Sh_Khan 感谢您的回复。你是说我需要在 MainCoordinator 中定义一个协议,然后在我的 firstViewController 中实现它?

标签: ios swift coordinator-pattern


【解决方案1】:

使用委托模式或闭包回调模式,您可以将值从第二个视图控制器传递到第一个视图控制器。

如果你使用委托模式,数据流如下。 SecondViewController -> SecondViewControllerDelegate -> SecondCoordinator -> SecondCoordinatorDelegate -> FirstCoorfinator -> FirstViewController

如果你使用闭包回调模式,你将传递一个闭包作为参数 SecondCoordinator 的 start 方法或初始化器。

【讨论】:

  • 感谢您的回答,是的,我可以在我的 firstViewController 的 showSecondViewController 方法中添加 coordinator?.delegate = self,但我正在寻找最佳解决方案并有两个委托,一个从 firstViewController 到 MainCoordinator 和反之亦然不是我认为的最佳解决方案,我不知道也许我错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2017-11-12
相关资源
最近更新 更多