未调用协议函数

Posted

技术标签:

【中文标题】未调用协议函数【英文标题】:Protocol Function not being called 【发布时间】:2021-01-13 18:24:26 【问题描述】:

请帮忙。我想要达到的目标 是当我点击特定的 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?
    

【问题讨论】:

一个非常常见的错误:MainController() 是一个全新的实例,它不是情节提要中的实例(我希望编译器会出错)。您需要通过 segue 或实例化的真实引用。 @vadian 我一直在做没有故事板的项目。 好的,但是MainController() 也不是视图层次结构中的预期控制器。然后你必须从导航控制器获取引用。 就您而言,我认为您不是代表。你可以做的是在推送到 ReportDetailsMapController 时将模型注入它。 programmingios.net/dont-make-a-new-instance-by-mistake 【参考方案1】:

没有调用该方法,因为您没有将要推送的视图控制器分配给 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

【讨论】:

感谢您指出我哪里出错了。我也会尝试你的其他建议。

以上是关于未调用协议函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有调用协议函数

辅助函数未加载 laravel 5 - 调用未定义函数

如果子类未定义构造函数,是不是会调用父构造函数?

C函数中如何调用未实例化类的成员函数

数据流 - 未调用函数 - 错误 - 未定义名称

从另一个未被调用的 Lambda 函数中调用 Lambda 函数