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

gio*_*eli 3 uitableview ios uitapgesturerecognizer swift

我想通过点击单元格标签(而不是didSelectRowAt)来编辑标签文本。点击标签函数 ( 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
}
Run Code Online (Sandbox Code Playgroud)

这是函数:

var customTableViewController = ToDoItemsCell()

@objc func toDoItemLabelTapped() {
    print(customTableViewController.toDoItemLabel.text)
}
Run Code Online (Sandbox Code Playgroud)

错误如下:

致命错误:隐式解包可选值时意外发现 nil

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

rma*_*ddy 5

问题出在你的customTableViewController变量上。它指的是从未出现在表视图中的无用单元格。摆脱它。这不是必需的。

通过点击手势获取单元格。点击手势有一个view属性。由于您将点击手势添加到单元格,因此它的view属性将是单元格。

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

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

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(toDoItemLabelTapped))
Run Code Online (Sandbox Code Playgroud)

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

tapGesture.delegate = self as? UIGestureRecognizerDelegate
Run Code Online (Sandbox Code Playgroud)

同时删除无关的行:

tapGesture = UITapGestureRecognizer(target: self, action: aSelector)
Run Code Online (Sandbox Code Playgroud)

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