如何在Swift 3中以编程方式选择collectionView中的单元格?

3

我刚开始学习Swift,发现在collectionView中编程选择单元格有些困难。尽管我找到了一些关于tableview的指导,但是实施时还是出错了。

 let indexPath = IndexPath(row: 0, section: 0)
    appsCollectionView.selectItem(at: indexPath, animated: false, scrollPosition: .bottom)
    appsCollectionView.delegate?.collectionView!(appsCollectionView, didSelectItemAt: indexPath)

根据其他答案,您需要使用第2行和第3行。不确定第3行在做什么。当我尝试运行此代码时,出现了错误。

collectionView:didSelectItemAtIndexPath:]: unrecognized selector sent to instance

谢谢!


请接受答案。 - Somoy Das Gupta
2个回答

3
此错误基本上告诉您,您没有实现UICollectionViewDelegate协议的collectionView(_,didSelectItemAt:_)方法,但我认为您不应该直接调用该方法(第3行)。
我非常确定调用selectItem(at:,animated:,scrollPosition:)(第2行)就足够了。集合视图应该滚动到所选单元格,并且单元格外观应更改为所选状态。但是,也许您的单元格外观在选择时没有改变,这使您认为它没有被选择?
如果还没有这样做,请在您的UICollectionViewCell子类中覆盖以下属性,并更改某个标签的颜色,例如:
override var isHighlighted: Bool {
    didSet {
        titleLabel.textColor = isHighlighted || isSelected ? .black : .darkGray
    }
}

override var isSelected: Bool {
    didSet {
        titleLabel.textColor = isHighlighted || isSelected ? .black : .darkGray
    }
}

尝试仅调用 selectItem(at:,animated:,scrollPosition:) 方法,也许你会注意到有所不同。

注意:正如在 selectItem(at:,animated:,scrollPosition:) 方法文档中所写:

此方法不会导致任何选择相关的委托方法被调用。

它只会改变单元格状态为选定,而不会触发任何在单元格上点击时会调用的操作。


我的函数func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { }也没有真正被调用... - xcalysta
集合视图是如何消失的?它的 contentOffset 是否移动到没有单元格显示的值?根据文档,selectItem(at:,animated:,scrollPosition:) 不会调用 didSelectItemAt。只需手动调用所需的代码即可。 - Ferschae Naej
整个CollectionView没有消失,我猜是因为背景颜色还在。我看到的是CollectionView中的单元格正在消失。我以为它可能会尝试滚动到所选单元格的位置,但我打印了CollectionView的内容偏移量,在我调用appsCollectionView.selectItem之后仍然是(0.0, 0.0)。 - xcalysta
我尝试了其他函数,比如appsCollectionView.scrollToItem(),但是同样的问题也出现了。 - xcalysta
我不认为 selectItem(at:,animated:,scrollPosition:) 是单元格消失的原因。你确定在调用 selectItem 之前或之后没有调用任何其他代码吗? - Ferschae Naej
显示剩余3条评论

1
根据其他答案,您需要第2行和第3行。不确定第3行在做什么。当我尝试运行此代码时,我收到了错误消息"collectionView:didSelectItemAtIndexPath:"]:未识别的选择子发送给实例"


您不需要显式调用collectionView代理方法。相反,如果您刚刚设置了代理,则只需实现该方法即可。
optional func collectionView(_ collectionView: UICollectionView, 
             didSelectItemAt indexPath: IndexPath)

我尝试仅调用selectItem(如Ferschae Naej所指出的)而没有最后一行,但似乎我的单元格在视图中消失了,控制台没有错误 - 这里可能有什么问题? - xcalysta
你有检查过你的单元格是否存在于那个IndexPath吗? - Hussain Shabbir
@xcalysta 请分享你的完整代码..你的代码有点令人困惑。 - Nazmul Hasan
我确定单元格存在,因为它正确显示了,对吧..?我还添加了完整的代码。 - xcalysta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接