我在iOS swift中使用VIPER架构。我有两个视图控制器,比如A
和B
。起初,我从A
到B
,执行一些任务,然后从B
回到A
。使用MVC或MVVM,我们可以创建协议并将数据从B
传输到A
。但对于VIPER,我感到困惑。这是我的VIPER代码B,同时点击"后退"按钮:
视图:
@IBAction func backButtonTapped(_ sender: UIButton) {
presenter?.goBack()
}
演示者:
func goBack() {
router.back()
}
路由器:
func back() {
viewController?.navigationController?.popViewController(animated: true)
//here I want to send data back to previous viewcontroller
}
我曾尝试在上一个控制器的路由器中创建一个方法,并通过该方法发送数据,但它不起作用,因为路由器除了视图之外没有任何呈现器或其他任何实例。
注意:-在Viper路由器是单向的。所以这可能会对你有所帮助。
- 在当前模块的VC中实现ProtocolDelegate
- 在下一个模块的路由器中创建委托变量
- 然后简单地将委托依赖性发送到下一个模块的路由器
- 并从Next Module的Router调用您的委托方法
模块A
final class VCA: SomeProtocolDelegate {
fund someMethod() {
//Your task Action From Module B
}
}
final class ModuleARouter: WireFrameProtocol {
fund gotoModuleB(withView vc: VCA) {
ModuleBRouter.load(onView: vc)
}
}
模块B
final class ModuleBRouter: WireframeProtocol {
internal weak var delegate: SomeProtocolDelegate?
// Here you can add more argument on load method for delegate
// since in this example i'm send data back ViewController So I didn't create
class func load(onView VC: UIViewController) {
//setup your VIPER protocol and class
if let vCA = VC as? VCA {
router.delegate = vCA
}
}
func backToPreviousModule() {
self.delegate?. someMethod()
}
}