为啥 UICollectionView didSelect 方法不起作用?
Posted
技术标签:
【中文标题】为啥 UICollectionView didSelect 方法不起作用?【英文标题】:Why UICollectionView didSelect method does not work?为什么 UICollectionView didSelect 方法不起作用? 【发布时间】:2016-08-19 10:01:26 【问题描述】:我以编程方式创建了我的UICollectionView
,在这种情况下我的didSelectItemAtIndexPath
方法根本不会调用。
let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: CGRectGetWidth(self.view.frame), height: 360), collectionViewLayout: layout)
collectionView.delegate = self
collectionView.dataSource = self
collectionView.userInteractionEnabled = true
那么,有什么问题吗?为什么当我点击单元格时没有得到响应?
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
print("Selected Cell: \(indexPath.row)")
【问题讨论】:
委托对象不是nil
?
1) 尝试设置Background Color
的UICollectionView
和UICollectionViewCell
。看看它是否在屏幕上正确可见。 2) 在UICollectionView
上设置userInteractionEnabled
= true
@pkc456 为什么?我已经看到了我的单元格,并且已经启用了 userInteraction
@Doe 这个测试练习只是交叉检查 UI 元素的位置。有时 UI 组件会被其他视图覆盖(由于错误的自动布局)。或者有时 UI 元素的框架在外部但在屏幕上可见,因此无法获得点击操作。
也许你在 vc 的视图中添加了一些手势识别器?
【参考方案1】:
我知道这可能会迟到,但出于功能目的,CollectionView[didSelectItem]
未响应触摸可能是因为您还启用了addGestureRecognizer
,因此请检查您是否在您的@987654323 上设置了手势识别器@喜欢这样collectionView?.addGestureRecognizer(tapGestRecognizer)
【讨论】:
谢谢。这节省了我的时间。我在我的表格视图上启用了手势识别器,其单元格包含 collectionView,它阻止了代表被触发 谢谢。就我而言,错误是我在视图控制器上添加了手势识别器。【参考方案2】:我刚遇到这种情况。
您是否在集合视图单元格中放置了按钮或交互式视图? 您的触摸由它处理,然后不调用 didSelect。
通过 Interface builder 关闭 User Interaction Enabled 属性,或以编程方式设置为 false。
【讨论】:
谢谢你让我开心【参考方案3】:签入UiCollectionviewCell
子类isUserInteractionEnabled
属性或以编程方式将其设置为true
self.contentView.isUserInteractionEnabled = true
【讨论】:
【参考方案4】:请确保您没有将 UICollectionViewDelegate 和 UICollectionViewDelegateFlowLayout 放在一起。
【讨论】:
【参考方案5】:在 Project Navigator 中选择 ViewController.swift。用这个更新类声明:
class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource
//After class declaration create a new variable:
var collectionView: UICollectionView!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
layout.itemSize = CGSize(width: 90, height: 120)
collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
collectionView.dataSource = self
collectionView.delegate = self
collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
collectionView.backgroundColor = UIColor.whiteColor()
self.view.addSubview(collectionView)
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
print("Selected Cell: \(indexPath.row)")
【讨论】:
【参考方案6】:我发现了一个奇怪的边缘情况,我不小心为单元格的容器视图指定了一个类(以及一个对容器视图无效的类),一切看起来都很好,我没有收到任何警告,但是 @987654321 @ 不会被调用。
这是我生命中的 5 个小时,我想回来。
【讨论】:
以上是关于为啥 UICollectionView didSelect 方法不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 UICollectionView 不滚动其中的 UIButtons?
为啥我们需要 visibleCells 函数(UICollectionView)
为啥 scrollViewWillEndDragging 会影响 UICollectionView 和 UITableView?
具有多个 CollectionViewLayout 的单个 UICollectionView。为啥布局混乱?
为啥 iPhone X 忽略 UICollectionView 的 UIEdgeInsets?
为啥将 UICollectionViewLayout 分配给 UICollectionView 后 UICollectionViewCells 不再可见?