使用 UITapGestureRecognizer 从点击的单元格中获取标签文本

Get label text from tapped cell with UITapGestureRecognizer

我想在点击单元格标签时编辑标签文本(不是 didSelectRowAt)。 Tapped 标签函数 (toDoItemLabelTapped) 显示为 nil。

虽然 UITapGestureRecognizer 效果很好,但它没有通过标签文本。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as!  ToDoItemsCell

    cell.delegate = self

    cell.textField.delegate = self
    cell.textField.isHidden = true
    cell.toDoItemLabel.isUserInteractionEnabled = true

    let aSelector : Selector = Selector(("toDoItemLabelTapped"))
    var tapGesture = UITapGestureRecognizer(target: self, action: aSelector)

    tapGesture.numberOfTapsRequired = 1
    cell.addGestureRecognizer(tapGesture)
    tapGesture.delegate = self as? UIGestureRecognizerDelegate
    tapGesture = UITapGestureRecognizer(target: self, action: aSelector)

    return cell
}

函数如下:

var customTableViewController = ToDoItemsCell()

@objc func toDoItemLabelTapped() {
    print(customTableViewController.toDoItemLabel.text)
}

错误如下:

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

如何让点击手势通过单元格的标签文本?

问题出在您的 customTableViewController 变量上。它指的是 table 视图中从未出现过的无用单元格。摆脱它。没必要。

从点击手势获取单元格。点击手势有 view 属性。由于您将点击手势添加到单元格,因此它的 view 属性 将成为单元格。

@objc func toDoItemLabelTapped(_ gesture: UITapGestureRecognizer) {
    let cell = gesture.view as! ToDoItemsCell
    print(cell.toDoItemLabel.text)
}

您还需要修复 cellForRowAt 中的选择器。删除 aSelector 变量。

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(toDoItemLabelTapped))

除非您出于某种原因实际实现了手势委托方法,否则删除该行:

tapGesture.delegate = self as? UIGestureRecognizerDelegate

也去掉多余的线:

tapGesture = UITapGestureRecognizer(target: self, action: aSelector)

另请注意,单元格被重复使用,因此您在用户滚动时向每个单元格添加越来越多的点击手势。您可能希望避免向任何单元格添加一个以上的点击手势。