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制作(源码)