CollectionView Segue 在接收时发现 nil ViewController

CollectionView Segue finding nil on receiving ViewController

我有一个集合视图,它在其索引中选择一个项目并执行到下一个 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)
}

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

在我执行打开右边的 segue 之后 ViewController 广告对象总是 nil。

var advertisement : Advertisement!

override func viewDidLoad() {
    super.viewDidLoad()

    let title = advertisement.title
    print(title)

}

即使在集合视图的 didSelectItem 函数赋值期间我可以看到它具有值,但它永远不会获取对象的值。

我在这里错过了什么?

您应该在 prepare(for:sender:) 函数中设置 advertisement 变量。您在 didSelect 函数中创建的视图控制器未被使用。

添加如下内容:

func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let viewController = segue.destination as? PlayerViewController {
        let adChoice = adArray[sender]
        viewController.advertisement = sender as? STZMediaItem
    }
}

并将您的 didSelect 函数更新为:

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

当用户点击 collectionViewCell 时,应用程序应使用 indexPath 作为发件人执行 segue:

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
        }
    }
}