Swift 未调用协议函数
请帮忙。我想要达到的目标 当我点击特定的collectionViewCell时,会推送ReportDetailsMacController,并将我的报告[indexPath.item]从MainController发送到ReportDetailsMacController 协议:Swift 未调用协议函数,swift,delegates,protocols,Swift,Delegates,Protocols,请帮忙。我想要达到的目标 当我点击特定的collectionViewCell时,会推送ReportDetailsMacController,并将我的报告[indexPath.item]从MainController发送到ReportDetailsMacController 协议: protocol MainControllerDelegate: class { func sendReport(data: ReportModel) } 第一个VC: class MainContr
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时将模型注入到该控件中。谢谢你告诉我哪里出错了。我也会试试你的其他建议。谢谢你告诉我哪里错了。我也会尝试你的其他建议。