微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用协调器模式在控制器之间传递数据

如何解决使用协调器模式在控制器之间传递数据

我正在尝试了解协调器模式的工作原理。

这是我的代码

import UIKit
import Foundation

class CheckoutCoordinator: Coordinator,ScheduleDelegate {
    
    var childCoordinator: [Coordinator] = [Coordinator]()
    var navigationController: UINavigationController
    
    init(nav: UINavigationController) {
        self.navigationController = nav
    }
    
    func start()  {
        let ctrl = CheckoutController.initFromStoryboard()
        ctrl.coordinator = self
        self.navigationController.pushViewController(ctrl,animated: true)
    }
    
    func openSchedule()  {
        let ctrl = ScheduleController.initFromStoryboard()
        ctrl.delegate = self
        self.navigationController.pushViewController(ScheduleController.initFromStoryboard(),animated: true)
    }
    
    func didSelectTimings(date: NSDate,timings: Nsstring,distance: Double) {
        
    }

}

CheckoutController,我转到ScheduleController,做一些调用其委托方法的工作。委托应该更新 CheckoutController 和 pop scheduleController 中的一些值。我无法找到上述 senario 的任何具体解释以及如何“正确”实施它。

请注意,调度控制器没有向前导航,因此没有协调器类。

任何指导将不胜感激

解决方法

我不会在协调器中处理委托逻辑。相反,我会将它直接移到您的 CheckoutController 中。因此,当调用 ScheduleController 时,它会在您的协调器中看起来像这样:

func openSchedule(delegate: ScheduleDelegate?)  {
    let ctrl = ScheduleController.initFromStoryboard()
    ctrl.delegate = delegate
    navigationController.pushViewController(ScheduleController.initFromStoryboard(),animated: true)
}

在您的 CheckoutController 中,符合 ScheduleDelegate 委托:

class CheckoutController: ScheduleDelegate {
    func didSelectTimings(date: NSDate,timings: NSString,distance: Double) {
       // Do your staff   
    }
}

然后在您调用委托方法后的 ScheduleController 中,我将调用协调器来弹出 self(在这种情况下为 ScheduleController)。

delegate?.didSelectTimings(date: yourDate,timings: someTiming,distance: distance)
if let checkoutCoordinator = coordinator as? CheckoutCoordinator {
       checkoutCoordinator.popViewController() 
}

弹出逻辑可以只在你的 viewController 中,但我喜欢只在 Coordinator 中保留导航。在您的 CheckoutCoordinator 或更好的 Coordinator 中(因为此函数非常通用),实现 pop 函数。

extension Coordinator {
     function popViewController(animated: Bool = true) {
         navigationController?.popViewController(animated: animated)
     }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。