Swift中通过delegate向FloatingPanel传值为nil的问题如何解决
问题根源
你出现代理无法传值的核心原因是代理指向的实例和实际运行的实例不是同一个,具体问题点如下:
ItenaryFloatingPanelVC中通过let itenaryVC = ItenaryVC()、let discoverVC = DiscoverVC()创建的是完全独立的新实例,和跳转流程中正在使用的ItenaryVC、DiscoverVC没有任何关联,给这两个新实例设置代理不会收到任何业务流程的回调。ItenaryVC中初始化ItenaryFloatingPanelVC悬浮面板时,没有给自身的delegate属性赋值为当前创建的悬浮面板实例,导致ItenaryVC的delegate始终为nil,API请求完成后触发代理方法无响应。
修复方案
步骤1:修改ItenaryVC的setupCard方法
创建悬浮面板实例后直接绑定代理,同时可以直接把已经拿到的locationDetails传给悬浮面板,不需要绕DiscoverVCDelegate:
private func setupCard() { guard let itenaryFlotingPanelVC = storyboard?.instantiateViewController(identifier: "itenaryPanel") as? ItenaryFloatingPanelVC else { return} // 绑定代理 self.delegate = itenaryFlotingPanelVC // 直接传递已有的位置数据,不需要走DiscoverVC的代理 itenaryFlotingPanelVC.location = self.locationDetails let fpc = FloatingPanelController() fpc.set(contentViewController: itenaryFlotingPanelVC) fpc.addPanel(toParent: self) }
步骤2:修改ItenaryFloatingPanelVC的代码
删除无用的新建VC代码,新增location属性接收传递的数据:
class ItenaryFloatingPanelVC: UIViewController{ //MARK:- Outlets @IBOutlet weak var sloganLabel: UILabel! @IBOutlet weak var locationLabel: UILabel! @IBOutlet weak var locDesc: UITextView! @IBOutlet weak var itenaryTableView: UITableView! @IBOutlet weak var locDescHC: NSLayoutConstraint! // 新增属性接收传递的数据 var location: Location! var itenaries = [[Days]]() // 删除下面这两行无用代码 // let itenaryVC = ItenaryVC() // let discoverVC = DiscoverVC() override func viewDidLoad() { super.viewDidLoad() // 直接赋值位置信息 locationLabel.text = location.locationName locDesc.text = location.description // 按需替换为你要展示的字段 itenaryTableView.dataSource = self itenaryTableView.delegate = self locDescHC.constant = locDesc.contentSize.height itenaryTableView.register(UINib(nibName: R.nib.itenaryCell.name, bundle: nil), forCellReuseIdentifier: R.nib.itenaryCell.identifier) } } // 可以删除整个DiscoverVCDelegate的扩展,不需要再用 // extension ItenaryFloatingPanelVC : DiscoverVCDelegate { // func didSendSingleLocationData(_ discoverVC: DiscoverVC, location: Location) { // print(location) // locationLabel.text = location.locationName // } // }
额外提醒:你目前在
DiscoverVC的prepare方法里手动调用了一次destinationVC.getItenaries(),同时ItenaryVC的locationDetails属性的didSet也会触发一次getItenaries(),会导致重复请求同一份数据,建议删除其中一处调用即可。
内容的提问来源于stack exchange,提问作者Ikmal Azman
相关产品推荐
相关产品推荐

