【问题标题】:Button add target function not called in CollectionView cell按钮添加目标函数未在 CollectionView 单元格中调用
【发布时间】:2020-10-12 00:08:12
【问题描述】:

我有一个集合视图,其中每个单元格都有一个删除按钮。我在 cellForItemAt indexPath 函数中添加了以下代码。

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellTwo", for: indexPath) as! CustomCellTwo

cell.deleteButton.layer.setValue(indexPath.row, forKey: "index")

cell.deleteButton.addTarget(self, action: #selector(deleteCell), for: .touchUpInside)

最初它看起来好像工作得很好。但是,我发现如果我来回滚动然后点击删除按钮,则在第一次点击时不会调用添加目标函数。如果我再次点击,它会按预期工作。只有第一次点击不起作用。

几个小时以来,我一直在努力寻找原因和解决方案...请帮助提供任何想法和建议。

【问题讨论】:

  • 所以在你触摸 collectionView 后 addTarget 正在工作......但直到滚动才工作
  • 当我点击按钮而不滚动时,添加目标正在工作。但奇怪的是,如果我来回滚动然后点击一个离开屏幕并回到屏幕上的单元格(因为滚动),那么添加目标在第一次点击时不起作用。该按钮在视觉上对我的点击做出反应,但没有调用添加目标。添加目标仅在我再次点击单元格时才有效,因此它在我第二次点击时有效(但前提是我在第二次点击之前不再滚动)。看起来当单元格被滚动时,集合视图控制器会与按钮混淆......
  • 更好的设计理念是在单元类而不是控制器类中执行操作

标签: ios swift uibutton uicollectionviewcell addtarget


【解决方案1】:

尝试将按钮处理移动到CustomCellTwo 实现中。用@IBAction func 处理按钮事件touchUpInside。现在您可以使用在此函数主体中设置的断点对其进行调试。 还将闭包类型变量添加到您的 CustomCellTwo 以将 deleteCell 调用传递给它。所以也可以用断点检查。 示例:

class CustomCellTwo: UICollectionViewCell {
    var onDelete: (() -> Void)?
    @IBAction func onDeleteButtonTouch(_ sender: Any) {
        onDelete?()
    }
}


// in your UICollectionViewDataSource

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellTwo", for: indexPath) as! CustomCellTwo
    cell.onDelete = {
        self.deleteCell(indexPath)
    }
}

【讨论】:

  • 感谢您的解决方案。我按照您的说明进行操作,但仍然显示相同的反应...如果我不滚动,该按钮可以正常工作。但是,如果我来回滚动两次,最后一个单元格的按钮也不会触发 @IBAction。如果我再次点击(在第二次点击中),它将触发该功能。这真的很奇怪......我已经花了很多时间试图解决这个问题......你的想法将不胜感激。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2021-11-10
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多