我无法使用 swift 中的协议传递数据
I cannot able to pass data with using protocol in swift
我有一个 xibs,在我的 homeVC 中,我在 collectionView 的方法中的 didselectItem 中传递了一个 viewModel。之后,我正在导航 detailVC 并将我的委托分配给那里的自我,但我无法打印数据
首页VC
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 实例。
我有一个 xibs,在我的 homeVC 中,我在 collectionView 的方法中的 didselectItem 中传递了一个 viewModel。之后,我正在导航 detailVC 并将我的委托分配给那里的自我,但我无法打印数据
首页VC
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 实例。