Swift 未调用协议函数

Swift 未调用协议函数,swift,delegates,protocols,Swift,Delegates,Protocols,请帮忙。我想要达到的目标 当我点击特定的collectionViewCell时,会推送ReportDetailsMacController,并将我的报告[indexPath.item]从MainController发送到ReportDetailsMacController 协议: protocol MainControllerDelegate: class { func sendReport(data: ReportModel) } 第一个VC: class MainContr

请帮忙。我想要达到的目标 当我点击特定的collectionViewCell时,会推送ReportDetailsMacController,并将我的报告[indexPath.item]从MainController发送到ReportDetailsMacController

协议:

 protocol MainControllerDelegate: class {
     func sendReport(data: ReportModel)
 }
第一个VC:

 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?
 }   

未调用该方法,因为未将要推送的视图控制器指定给委托属性。 选择单元格后,可以按以下顺序执行:初始化视图控制器并将其分配给委托,然后调用委托方法并推送该视图控制器:

func collectionView\uCollectionView:UICollectionView,didSelectItemAt indexPath:indexPath{ let report=reports[indexPath.item] //当我在这里打印report.name时,一切都正确执行 让viewController=ReportDetailsMapController self.delegate=viewController self.delegate?.sendReportdata:报告 self.navigationController?.pushViewControllerServiceController,动画:true } 但是,我认为一种更简单、更优雅的方法是在ReportDetailsMapController上创建该属性,并在推送它之前注入它。
这里有一个与此相关的类似问题/答案:

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

func collectionView\uCollectionView:UICollectionView,didSelectItemAt indexPath:indexPath{ let report=reports[indexPath.item] //当我在这里打印report.name时,一切都正确执行 让viewController=ReportDetailsMapController self.delegate=viewController self.delegate?.sendReportdata:报告 self.navigationController?.pushViewControllerServiceController,动画:true } 但是,我认为一种更简单、更优雅的方法是在ReportDetailsMapController上创建该属性,并在推送它之前注入它。
这里有一个类似的问题/答案:

一个非常常见的错误:MainController是一个全新的实例,它不是故事板中的实例,我希望编译器抛出一个错误。您需要通过segue或实例化获得真正的引用。@vadian我一直在做没有故事板的项目。好的,但是MainController也不是视图层次结构中预期的控制器。然后你必须从导航控制器获取参考。在你的情况下,我认为你不需要代理。你可以做的是在推送到ReportDetailsMapController时将模型注入到它。一个非常常见的错误:MainController是一个全新的实例,它不是故事板中的实例,我希望编译器抛出一个错误。您需要通过segue或实例化获得真正的引用。@vadian我一直在做没有故事板的项目。好的,但是MainController也不是视图层次结构中预期的控制器。然后你必须从导航控制器获取参考。在你的情况下,我认为你不需要代理。你可以做的是在按下ReportDetailsMapController时将模型注入到该控件中。谢谢你告诉我哪里出错了。我也会试试你的其他建议。谢谢你告诉我哪里错了。我也会尝试你的其他建议。