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 系统默认调用函数 didSelectItemAtIndexPathCollectionView 以便您必须通过为您的单元格注册 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 函数中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

集合视图单元格在顶部留下空间

UICollectionView 单元格在我滚动时消失

识别 CollectionView 中的单元格

tableview不同的单元格在swift中有不同的高度

自定义收藏视图单元格在点击时消失

集合视图,具有自定义布局,单元格在滚动时行为不端