CollectionView 中的 CollectionView:使用 didSelectItemAt 执行Segue

Posted

技术标签:

【中文标题】CollectionView 中的 CollectionView:使用 didSelectItemAt 执行Segue【英文标题】:CollectionView within a CollectionView: Using didSelectItemAt to performSegue 【发布时间】:2019-04-12 20:18:49 【问题描述】:

我在 collectionView 中有一个 collectionView,我希望能够在第二个 collectionView 中选择一个单元格来执行对另一个 ViewController 的 segue。

目前,当我选择一个单元格时,我收到以下消息: " Receiver ... 没有带有标识符 'ToVC2' 的 segue。"

但是,我已经从其他 UIButtons 中使用了这个 segue/标识符,并且它可以工作。


我有两个 ViewController:ViewController1 和 ViewController2。

在 ViewController1 上,有一个具有垂直滚动功能的 collectionView(“categoryCollectionView”)。

在 categoryCollectionView 中,还有另一个允许水平滚动的 collectionView(“eventCollectionView”)。

对于 numberOfItemsInSection 和 cellForItemAt,两个 collectionView 已设置并正常工作。我现在希望能够在 eventCollectionView 中选择一个单元格,并导致从 ViewController1 到 ViewController2 的 segue。

我在 ViewController1 中添加了一个函数:

func segueToViewController2(event: Event)

    performSegue(withIdentifier: "ToVC2", sender: event)


在 eventCollectionView 的 didSelectItemAt 中,我尝试了以下方法:

var viewController1: ViewController1? = ViewController1()
viewController1.segueToViewController2(event: eventSelected)

当我选择一个单元格时,我收到以下错误消息:

'Receiver() 没有标识符为'ToVC2'的segue'

但是,如果从 ViewController1 上的常规 UIButton 调用此函数会正确执行转场(因此我知道问题不在于没有转场/标识符错误。)我认为问题在于正在调用该函数来自 collectionView 中的 collectionView。

请帮忙!!!!!!

【问题讨论】:

【参考方案1】:

我认为问题在于当您调用var viewController1: ViewController1? = ViewController1() 时,您正在初始化ViewController1 的一个新实例。这可能不是你想要做的。根据您所说的,您应该将引用向下传递到您创建的集合视图的层次结构中,以便您的 didSelect 可以在 ViewController1 的原始实例上调用 segue 函数。理想情况下,您会使用委托等设计模式来执行此操作。

【讨论】:

我想出了如何将引用向下传递到层次结构中,并且成功了!我在两个 collectionView 的每个单元格中存储了一个( var viewController1: ViewController1! )。这样,当我调用 segue 时,它​​确切地知道从哪里调用它。谢谢你的帮助!! 没问题。就像一个风格提示一样,传递这样的引用通常不是好的做法,因为它给集合视图提供了对视图控制器的过多访问权限。我建议使用委托来隐藏某些功能。此外,如果您将引用视图控制器的var 存储在视图控制器的其中一个子视图中,您将创建一个保留周期,这将导致内存泄漏。您至少应该将代码更改为 weak var 以创建弱引用而不是强引用。

以上是关于CollectionView 中的 CollectionView:使用 didSelectItemAt 执行Segue的主要内容,如果未能解决你的问题,请参考以下文章

iOSCollectioView滚动到指定section的方法

猫猫学iOS 之广告轮播图,collectionView制作(源码)

隐藏 UIView 并调整其他小部件以占用空间?

Dispose 中的 GC.Collect() 简单类

CollectionView 中的 CollectionView:使用 didSelectItemAt 执行Segue

CollectionView didDeselectItemAt 没有被调用 CollectionView 中的单选