VIPER架构中Observer与Currencies模块delegate回调依赖配置问题
问题核心原因
你当前的代理回调不生效,是因为你在CurrenciesConfigurator中给CurrenciesPresenter的delegate属性赋值了一个临时创建的空局部变量,没有把已经遵守CurrenciesDelegate协议的ObserverPresenter实例传入配置流程。
修改步骤
1. 调整CurrenciesConfigurator的配置方法,新增delegate入参
修改配置协议和实现类,支持外部传入代理实例:
protocol CurrenciesConfiguratorProtocol { // 新增delegate参数 func configure(with viewController: CurrenciesViewController, delegate: CurrenciesDelegate?) } class CurrenciesConfigurator: CurrenciesConfiguratorProtocol { func configure(with viewController: CurrenciesViewController, delegate: CurrenciesDelegate?) { let presenter = CurrenciesPresenter(view: viewController) let interactor = CurrenciesInteractor(presenter: presenter) let router = CurrenciesRouter(view: viewController) viewController.presenter = presenter presenter.interactor = interactor presenter.router = router // 直接赋值外部传入的代理实例 presenter.delegate = delegate } }
2. 移除CurrenciesViewController内部的配置调用
删除CurrenciesViewController中原本的全局configurator变量,以及viewDidLoad中的configure调用,控制器的配置逻辑移到外部创建实例的位置执行。
3. 在Observer模块跳转逻辑中完成配置
在Observer模块负责跳转的位置(通常是ObserverRouter)创建CurrenciesViewController实例后,调用配置方法时传入当前的ObserverPresenter作为代理:
// ObserverRouter中的跳转逻辑示例 func presentCurrenciesPage(from sourceVC: UIViewController, delegate: CurrenciesDelegate?) { let currenciesVC = CurrenciesViewController() let configurator = CurrenciesConfigurator() // 配置时传入代理实例 configurator.configure(with: currenciesVC, delegate: delegate) sourceVC.present(currenciesVC, animated: true) }
如果是ObserverPresenter触发跳转,调用Router方法时传入self即可:
// ObserverPresenter内触发跳转的代码 func navigateToCurrenciesPage() { router.presentCurrenciesPage(from: view, delegate: self) }
修改完成后,CurrenciesPresenter的delegate就会持有正确的ObserverPresenter实例,dismiss时调用的代理方法就能正常触发Observer模块的更新逻辑。
内容的提问来源于stack exchange,提问作者MaryLitv21
相关产品推荐
相关产品推荐

