首页 > 解决方案 > CollectionView Segue 在接收 ViewController 时发现 nil

问题描述

我有一个集合视图,它在其索引中选择一个项目并执行到下一个 ViewController 的 segue。当呈现下一个 ViewController 时,我的对象的值为nil.

这是collectionView中的调用:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    guard let adViewVC = storyboard?.instantiateViewController(withIdentifier: adViewPageID) as? AdViewPageVC else {return}
    let adChoice = adArray[indexPath.row]
    adViewVC.advertisement = adChoice
    performSegue(withIdentifier: adViewPageSegue, sender: self)
}

请注意,保护语句正在执行,如果我从 adArray 打印一个值,它在此函数中具有值。

在我执行打开正确 ViewController 的 segue 之后,广告对象始终为零。

var advertisement : Advertisement!

override func viewDidLoad() {
    super.viewDidLoad()

    let title = advertisement.title
    print(title)

}

即使我可以didSelectItem在集合视图的函数分配期间看到它具有值,这也永远不会获得对象的值。

我在这里想念什么?

标签: iosswiftuicollectionviewsegueuistoryboardsegue

解决方案


当用户点击 collectionViewCell 时,应用程序应该执行 segueindexPath作为发送者:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    performSegue(withIdentifier: adViewPageSegue, sender: indexPath)
}

并准备好方法中所有必要的东西prepare(for:sender:)。而且您不必从情节提要中初始化 viewController。segue.destination足够的。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let identifier = segue.identifier {
        if identifier == adViewPageSegue {
            guard let adViewVC = segue.destination as? AdViewPageVC else {return}
            let indexPath = sender as! IndexPath
            let adChoice = adArray[indexPath.row]
            adViewVC.advertisement = adChoice
        }
    }
}

推荐阅读