【问题标题】:CollectionView Segue finding nil on receiving ViewControllerCollectionView Segue 在接收 ViewController 时发现 nil
【发布时间】:2018-05-17 23:28:28
【问题描述】:

我有一个集合视图,它在其索引中选择一个项目并执行到下一个 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 打印一个值,它在此函数中具有值。

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

var advertisement : Advertisement!

override func viewDidLoad() {
    super.viewDidLoad()

    let title = advertisement.title
    print(title)

}

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

我在这里错过了什么?

【问题讨论】:

  • 我将投票关闭它,因为它已经解决了。我不确定其他地方是否有人问过这个具体问题?

标签: ios swift uicollectionview segue uistoryboardsegue


【解决方案1】:

当用户点击 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
        }
    }
}

【讨论】:

  • 正在尝试,会通知您。
  • 仍然找不到零。通过调试它,它一直保持一个值,直到设置我们的 adViewVC.advertisement = adChoice。
  • 但是当我们到达时,当我尝试访问它时它仍然是 nil。
  • 让我们更改这一行guard let adViewVC = segue.destination as! AdViewPageVC else {return}。有效吗?
  • 我看到您使用 segue 转到另一个视图控制器。这不需要从情节提要中初始化 viewController。 segue.destination是你需要的。
【解决方案2】:

您应该在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)
}

【讨论】:

  • 让我试一试!
  • 需要中号的吗?
  • 数据量相当大
  • 会给你一个支持,让我更接近答案。 @Danh Huynh 发现了问题。
猜你喜欢
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
相关资源
最近更新 更多