美文网首页
swift 组件式开发 跨组件正向传值和回传以及返回方式

swift 组件式开发 跨组件正向传值和回传以及返回方式

作者: 优优切克闹 | 来源:发表于2020-03-10 17:40 被阅读0次

    现在负责的项目是组件式开发,涉及到了跨组件传值和返回传值以及跳转问题

    问题描述:
    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)
    

    完成~
    啊有点复杂,怀疑过段时间我自己都看不明白了

    相关文章

      网友评论

          本文标题:swift 组件式开发 跨组件正向传值和回传以及返回方式

          本文链接:https://www.haomeiwen.com/subject/mqcgdhtx.html