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

我无法在 swift 中使用协议传递数据

如何解决我无法在 swift 中使用协议传递数据

我有一个xib,在我的homeVC 中,我在collectionView 的方法中的didselectItem 中传递了一个viewmodel。在那之后,我正在导航 detailVC 并将我的委托分配给 self 那里,但我无法打印数据

HomeVC

protocol HomeViewControllerDelegate {
func didTappedindex(viewmodel: HomeCollectionViewCellviewmodel)}

    func collectionView(_ collectionView: UICollectionView,didSelectItemAt indexPath: IndexPath) {
    
    let game = games[indexPath.row]

    self.delegate?.didTappedindex(viewmodel: HomeCollectionViewCellviewmodel(with: game))
    
    self.tabBarController?.navigationController?.pushViewController(DetailViewController(nibName: "DetailViewController",bundle: nil),animated: true)
    
}

DetailVC

class DetailViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    HomeViewController().delegate = self
}

}

扩展 DetailViewController: HomeViewControllerDelegate {

func didTappedindex(viewmodel: HomeCollectionViewCellviewmodel) {
    print(viewmodel.title)
}

}

解决方法

当你打电话

HomeViewController().delegate = self

您正在创建 HomeViewController() 的新实例。您可能会将此实例与您在其他地方创建的实例混淆。您想分配正确的 HomeViewController 的委托。

一种选择是向 HomeViewController 添加一个实例变量和共享函数,以允许它跟踪其实例:

private static var instance: HomeViewController?

internal class func shared() -> HomeViewController {
    guard let currentInstance = instance else {
        instance = HomeViewController()
        return instance!
    }
    return currentInstance
}

然后你可以像这样在 DetailViewController 中设置委托:

HomeViewController.shared().delegate = self

另一种选择是拥有一个协调器,您可以在其中跟踪所有视图控制器。然后你可以将 DetailViewController 传递给 HomeViewController 实例。

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