Swift - 在表格单元格中为对象添加手势识别器

时间:2015-08-29 19:53:45

标签: ios xcode swift uigesturerecognizer

我试图将手势识别器添加到表格视图单元格中的对象(特定于图像)。现在,我对手势识别器很熟悉,但是对于如何设置这个问题我感到有些困惑。实际的表格单元格没有viewDidLoad方法,因此我不认为我可以在那里声明手势识别器。

这个问题(UIGestureRecognizer and UITableViewCell issue)似乎是相关的,但答案是在客观C中,不幸的是我只能流利地说。

如果有人可以帮我解决如何向表格单元格中的对象添加手势识别器(不是整个桌面视图),或者甚至可能帮助我翻译上述链接中的答案快点,我很感激

3 个答案:

答案 0 :(得分:15)

这是链接帖子解决方案的快速Swift翻译,将滑动手势识别器添加到UITableView,然后确定滑动发生在哪个单元格:

class MyViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        var recognizer = UISwipeGestureRecognizer(target: self, action: "didSwipe")
        self.tableView.addGestureRecognizer(recognizer)
    }

    func didSwipe(recognizer: UIGestureRecognizer) {
        if recognizer.state == UIGestureRecognizerState.Ended {
            let swipeLocation = recognizer.locationInView(self.tableView)
            if let swipedIndexPath = tableView.indexPathForRowAtPoint(swipeLocation) {
                if let swipedCell = self.tableView.cellForRowAtIndexPath(swipedIndexPath) {
                    // Swipe happened. Do stuff!
                }
            }
        }
    }

}

答案 1 :(得分:2)

你去吧。您在问题中提到的Swift版本的解决方案

"您可以将其添加到viewDidLoad中的tableview中,而不是直接将手势识别器添加到单元格中。

在didSwipe-Method中,您可以按如下方式确定受影响的IndexPath和单元格:"

func didSwipe(gestureRecognizer:UIGestureRecognizer) {
    if gestureRecognizer.state == UIGestureRecognizerState.Ended {
        let swipeLocation = gestureRecognizer.locationInView(self.tableView)
          if let swipedIndexPath = self.tableView.indexPathForRowAtPoint(swipeLocation){
            if let swipedCell = self.tableView.cellForRowAtIndexPath(swipedIndexPath!){


      }
    }
  }
}

答案 2 :(得分:1)

Swift 4的更新:

let swipeGestueRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(didRecognizeSwipeGestue(_:)))
self.view.addGestureRecognizer(swipeGestueRecognizer)

选择器:

@objc func didRecognizeSwipeGestue(_ sender: UISwipeGestureRecognizer) {

    if sender.state == UIGestureRecognizerState.ended {
        let location = sender.location(in: self.tableView)
        if let indexPath = tableView.indexPathForRow(at: location) {
            if let cell = self.tableView.cellForRow(at: indexPath) {
                // todo
            }
        }
    }
}