【问题标题】:I cannot able to pass data with using protocol in swift我无法在 swift 中使用协议传递数据
【发布时间】:2021-06-21 15:11:07
【问题描述】:

我有一个 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-.inti() 的简短语法。因此,您正在创建HomeViewController 的新实例,您没有将代理设置为您在屏幕上看到的那个,而是另一个(之后不再使用)。
  • @Larme 对不起,我听不懂你,所以在这种情况下我该怎么办
  • @matt 它准确地总结了我的情况,谢谢:)

标签: ios swift xcode delegates protocols


【解决方案1】:

当你打电话时

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 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多