collectionView 单元格在 tapGestureRecognizer 函数中不起作用
Posted
技术标签:
【中文标题】collectionView 单元格在 tapGestureRecognizer 函数中不起作用【英文标题】:collectionView cell not working in tapGestureRecognizer function 【发布时间】:2019-07-28 10:43:59 【问题描述】:我想在单击/点击 collectionView 单元格时更改单元格标签文本。 我尝试了以下方法,但这不起作用。
@objc func tap(_ sender: UITapGestureRecognizer)
let location = sender.location(in: self.collectionView)
let indexPath = self.collectionView.indexPathForItem(at: location)
if let index = indexPath
let subL = zoneDict?.sublevel[index.row]
if (subL?.sublevel.count)! > 0
DispatchQueue.main.async
self.zoneDict = subL!
print("self.zoneDict --\(self.zoneDict!)")
let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "colViewCell", for: index) as! CollectionViewCell
cell.zoneNameLabel.text = self.zoneDict?.name // Cannot update the text label. It show the default value
print("zone name-- \(self.zoneDict?.name)") // Its print the result.
self.delegate?.selectedZoneWithCellItems(items: "cell")
【问题讨论】:
你为什么不干脆在 didSelectItemAt 中做呢 我也试过 didSelectItemAt。另一件事是这个collectionView是一个tableView的子视图。如果点击的子级别有值,那么它会向tableView传递一个信号,tableView会添加一个包含collectionViewcell的行 【参考方案1】:我认为当您点击 collectionViewCell
时,ios 系统默认调用函数 didSelectItemAtIndexPath
的 CollectionView
以便您必须通过为您的单元格注册 UITapGestureRecognizer
的方式处理默认事件选定单元格,然后您必须设置属性视图 (isUserInteractionEnabled = true
)。
例如:self.yourview.isUserInteractionEnabled = true
【讨论】:
【参考方案2】:你可以在包含集合视图的 VC 中使用它
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = segmentCollectionView.dequeueReusableCell(withReuseIdentifier: SegmentCellId, for: indexPath) as! CollectionViewCell
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(printHello))
cell.addGestureRecognizer(tapGesture)
return cell
@objc func printHello()
print("Hello")
【讨论】:
【参考方案3】:您可以通过这种方式使用它的委托方法来更改单击单元格时的单元格标签文本:-> 这里我以两个数组来更新标签的文本为例: //下面用到的变量。
让 nameCapitalArr1 = [“ABC”、“DFG”、“EFG”、“HIJ”、“KLM”、“NOP”、“QRS”、“TUV”、“WXY”、“Z”]
让 nameSmallArr2 = [“abc”、“dfg”、“efg”、“hij”、“klm”、“nop”、“qrs”、“tuv”、“wxy”、“z”]
var changeFlag: Bool = false
func numberOfSections(in collectionView: UICollectionView) -> Int
return 1
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return nameCapitalArr1.count
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "LabelTextCollectionViewCell", for: indexPath) as? LabelTextCollectionViewCell else return UICollectionViewCell()
cell.nameTextLabel.text = !changeFlag ? nameCapitalArr1[indexPath.row] : nameSmallArr2[indexPath.row]
return cell
/*That method is called when tapping on the cell and reload that particular cell and also change the label text.*/
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
changeFlag = !changeFlag
collectionView.reloadItems(at: [indexPath])
输出:->它在点击具有切换效果的单元格时将带有大写字母的单元格文本反映为小数组值。
【讨论】:
以上是关于collectionView 单元格在 tapGestureRecognizer 函数中不起作用的主要内容,如果未能解决你的问题,请参考以下文章