0

我有一个奇怪的问题。向下滚动时,如果点击手势发生,单元格就会消失。

看起来我需要停止向单元格添加点击手势。我已经在功能上测试了这种情况,但它没有用。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as!  ToDoItemsCell

...

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

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

        tapGesture.numberOfTapsRequired = 1
        cell.addGestureRecognizer(tapGesture)

        return cell
}

这是我的功能:


 @objc func toDoItemLabelTapped(_ gesture: UITapGestureRecognizer) {

        if gesture.state == .ended {

            let location = gesture.location(in: self.tableView)

             if let indexPath = tableView.indexPathForRow(at: location) {

                if let cell = self.tableView.cellForRow(at: indexPath) as? ToDoItemsCell {
                cell.toDoItemLabel.isHidden = true
                cell.textField.isHidden = false
                cell.textField.becomeFirstResponder()
                cell.textField.text = cell.toDoItemLabel.text

           }
         }
       }
     }

点击有效,但它不断添加到其他单元格并使它们消失。可能是什么问题?

4

1 回答 1

0

手势应该添加到每个单元格一次。每次调用cellForRowAt时都会在您的代码中添加手势,并且会多次调用它,尤其是当您向下滚动到列表时。

移动您的手势将代码添加到 ToDoItemsCell 类,然后您可以使用委托在单元格被点击时通知您的视图控制器。

protocol ToDoItemsCellDelegate {
    toDoItemsCellDidTapped(_ cell: ToDoItemsCell)
}

class ToDoItemsCell : UITableViewCell {
    weak var delegate: ToDoItemsCellDelegate?
    var indexPath: IndexPath!
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        // code common to all your cells goes here
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(toDoItemLabelTapped))

        tapGesture.numberOfTapsRequired = 1
        self.addGestureRecognizer(tapGesture)
    }

    @objc func toDoItemLabelTapped(_ gesture: UITapGestureRecognizer) {
         delegate?.toDoItemsCellDidTapped(self)
    }
}

在函数cellForRowAt中,您只需选择委托并设置 indexPath。

注意: 如果您只想在用户点击任何单元格时执行操作,您可以使用UITableViewDelegate 的didSelectRowAt方法。

于 2019-08-19T19:54:16.937 回答