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

未调用协议函数

如何解决未调用协议函数

请帮忙。我正在努力实现的目标 是当我点击特定的 collectionViewCell 时,ReportDetailsMapController 被推送,我的报告[indexPath.item] 从 MainController 发送到 ReportDetailsMapController。

协议:

 protocol MainControllerDelegate: class {
     func sendReport(data: ReportModel)
 }

一个风投:

 class MainController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {

    var delegate: MainControllerDelegate?


    override func viewDidLoad() {
        super.viewDidLoad()
    }
     
      
    func collectionView(_ collectionView: UICollectionView,didSelectItemAt indexPath: IndexPath) {
       let report = reports[indexPath.item]
       //When I print(report.name) here. Everything executes correctly 
     
       self.delegate?.sendReport(data: report)

       self.navigationController?.pushViewController(ReportDetailsMapController(),animated: true)
    }
     

 }

第二个VC:

 class ReportDetailsMapController: UIViewController,MainControllerDelegate  {
     
    override func viewDidLoad() {
       super.viewDidLoad()
    
       let mc = MainController()
       mc.delegate = self

     }
      
     func sendReport(data: ReportModel) {

       print(data.name)//This does not execute when ReportDetailsMapController is loaded.
       print("Report sent")

     }


 }

报告模型:

 class ReportModel: NSObject {   
      var name: String?
      var surname: String?
      var cellNumber: String?
 }   

解决方法

未调用该方法,因为您没有将要推送的视图控制器分配给 delegate 属性。
当单元格被选中时,您可以按以下顺序进行:初始化视图控制器并将其分配给委托,然后调用委托方法并推送该视图控制器:

    func collectionView(_ collectionView: UICollectionView,didSelectItemAt indexPath: IndexPath) {
       let report = reports[indexPath.item]
       //When I print(report.name) here. Everything executes correctly 

       let viewController = ReportDetailsMapController()
       self.delegate = viewController
       self.delegate?.sendReport(data: report)

       self.navigationController?.pushViewController(viewController,animated: true)
    }

但是,我认为更简单、更优雅的方法是简单地在 ReportDetailsMapController 上创建该属性并在推送它之前注入它。 这里有一个与此相关的类似问题/答案:passing data from tableview to viewContoller in swift

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