现在负责的项目是组件式开发,涉及到了跨组件传值和返回传值以及跳转问题
问题描述:
image.png- 正向传值和反向传值如何实现
- 直接在B组件pop的话,会报错说找不到控制器,所以不能直接这样跨组件返回,所以要如何返回呢?
解决思路:
- push的时候将需要pop的控制器当成参数传入,在pop的地方直接用传入的控制器
上代码:
/// 待跳转的页面b(VerificationCodeVC)属于ModuleAccount组件(组件B),所以需要在组件Router ->Router-> ModuleAccount 中配置页面b的跳转函数
func VerificationCodeVC(callback:@escaping (Int) -> Void, bindType: Bool, viewController: UIViewController) -> UIViewController {
/// bindType为正向传入的值,viewController 为做完动作pop的控制器
let params = ["callback": callback,
kCTMediatorParamsKeySwiftTargetModuleName: "ModuleAccount",
"bindType": bindType, "viewController": viewController] as [String : Any]
return (performTarget("Account", action: "VerificationCodeVC", params: params, shouldCacheTarget: false) as! UIViewController)
}
/// 然后在组件ModuleAccount(组件B)中找到Target_Account文件做如下配置
@objc func Action_VerificationCodeVC(_ params: NSDictionary) -> UIViewController {
let (vc, input) = VerificationCodeModuleBuilder.setupModule()
let bindType = params["bindType"] as? Bool ?? false
guard let viewC = params["viewController"] as? UIViewController else { return UIViewController.init()}
/// 默认值为中国大陆
var sendVerCodeEntity = SendVerCodeEntity.init()
if bindType {
let currentCountry: CountryEntity = CountryListManager.defaultCountry()
sendVerCodeEntity.phone = AccountManager.shared.entity?.phoneNumber
sendVerCodeEntity.countryCode = String(currentCountry.code)
sendVerCodeEntity.sendType = .checkSms
} else {
sendVerCodeEntity.email = AccountManager.shared.entity?.email
sendVerCodeEntity.sendType = .emailAny
}
input.setInput(sendVerCodeEntity, enterViewType: .otherWays, VC: viewC)
if let verVC = vc as? VerificationCodeViewController, let callback = params["callback"] as? (Int) -> Void {
/// 在b控制器中定义回调函数 在pop的地方调用回调,在这里实现回调并将 result回传到组件A
verVC.finishHander = {[] (result) in
callback(result)
}
}
return vc
}
/// 在ModuleProfile(组件A)中的 OtherVerifMethodsPresenter (页面a_detail)中 调用push函数
if let vc = CTMediator.sharedInstance()?.VerificationCodeVC(callback: { [weak self] (result) in
/// 接收到页面b的回调result 这样a页面就可以根据回调做下一步动作(有时候是普通跳转,有时候是跨组件跳转,所以要回传参数判断是不是跨组件,才能区分下一步怎么做)
if let VC = self?.pVC as? ChangePasswordViewController {
VC.resultHander?(result)
}
/// self.pVC 是从页面a传来的 虽然是从a_detail跨组件的 但需求要求返回到a 所以返回哪个控制器 就带入哪个控制器到另一个组件中
}, bindType: bindType, viewController: self.pVC) {
nav?.pushViewController(vc, animated: true)
}
/// 最后只需在页面b中定义一个回调
var finishHander:((Int)->Void)?
/// 在准备调用pop的函数中调用block
self.finishHander?(0)
/// 然后直接返回
nav?.popToViewController(self.pVC, animated: true)
完成~
啊有点复杂,怀疑过段时间我自己都看不明白了
网友评论