didSelectRowAt(indexPath :)在平移手势后返回错误的行

时间:2019-03-16 13:20:43

标签: ios swift tableview uipangesturerecognizer

我已经以一种非常香草的方式实现了三指平移手势:

override func viewDidLoad() {
  super.viewDidLoad()

  let triplePanRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handleTriplePan(recognizer:)))
  triplePanRecognizer.delegate = self
  triplePanRecognizer.isEnabled = true
  triplePanRecognizer.minimumNumberOfTouches = 3
  tableView.addGestureRecognizer(triplePanRecognizer)
}

@objc func handleTriplePan(recognizer: UIPanGestureRecognizer) {
  switch recognizer.state {
  case .began:
    print("triple pan began")
    tableView.isScrollEnabled = false // You may wanna add this for convenience.
  case .changed:
    print("triple pan changed")
  case .ended:
    print("triple pan ended")
    tableView.isScrollEnabled = true
  case .cancelled:
    print("triple pan cancelled")
    tableView.isScrollEnabled = true
  }
}

现在,在执行三次平移后,在下一行选择中,didSelectRowAt(indexPath :)将返回错误的行,实际上,它不返回所选的行,而是 以前的三重锅开始了

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
   print("indexPath: \(indexPath.row)")
}

有没有办法规避这种行为?

编辑:现在,我已经在一个新的项目表单中对它进行了测试,一切正常。这一定是我项目中的错误,长按识别器也会发生。

编辑2:我可以通过以下方式解决此问题: 我的表格视图单元格也使用3d触摸,这就是为什么我的单元格使用touchesMoved和touchesEnded实现的原因。由于某些原因,touchesCancelled的实现是导致选择行为的原因。奇怪的是,即使此方法为空实现也会触发此问题。我能够删除该方法,现在平移/长按手势后的选择符合预期。

编辑3:事实证明,这是整个行为的发生,因为我没有在touchesCancelled内调用super.touchesCancelled ...

0 个答案:

没有答案