从UITapGestureRecognizer获取UITableViewCell

时间:2015-03-31 04:33:25

标签: ios uitableview swift uitapgesturerecognizer

我有一个带有多个部分的UITableView,在我的cellForRowAtIndexPath方法中,我将一个UITapGestureRecognizer添加到单元格的imageView(每个单元格都有一个小图像)。我通过使用:

成功访问了该图像(为了更改它)
var imageView : UIImageView! = sender.view! as UIImageView

然而,我现在需要做的是访问单元格的数据,我相信这意味着我需要能够访问单元格以获取节和行号。任何人都可以建议如何做到这一点?我的想法是,如果任务完成,我将图像更改为未选中的复选框,但在我的数据中,我需要将该任务标记为已完成。

4 个答案:

答案 0 :(得分:18)

在处理点按手势识别器的功能中,使用tableView的{​​{1}}功能获取触摸事件的可选索引路径,如下所示:

indexPathForRowAtPoint

从这里开始,您可以调用func handleTap(sender: UITapGestureRecognizer) { let touch = sender.locationInView(tableView) if let indexPath = tableView.indexPathForRowAtPoint(touch) { // Access the image or the cell at this index path } } 来获取单元格或其任何内容,因为您现在拥有已敲击单元格的索引路径。

答案 1 :(得分:6)

您可以获取图像的位置,以便找到indexPath并从那里找到具有该图像的单元格:

var position: CGPoint =  sender.locationInView(self.tableView)
var indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(position)!    
var cell = self.tableView(tableView, cellForRowAtIndexPath: indexPath)

答案 2 :(得分:2)

您错过了可以在此处使用代表设计模式。

创建一个协议,告诉代表您的复选框(imageView)中的状态更改:

enum CheckboxState: Int {
    case .Checked = 1
    case .Unchecked = 0
}

protocol MyTableViewCellDelegate {
    func tableViewCell(tableViewCell: MyTableViewCell, didChangeCheckboxToState state: CheckboxState)
}

假设你有一个UITableViewCell子类:

class MyTableViewCell: UITableViewCell {

    var delegate: MyTableViewCellDelegate?

    func viewDidLoad() {

        // Other setup here...

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "didTapImage:")
        imageView.addGestureRecognizer(tapGestureRecognizer)
        imageView.userInteractionEnabled = true
    }

    func didTapImage(sender: AnyObject) {

        // Set checked/unchecked state here
        var newState: CheckboxState = .Checked // depends on whether the image shows checked or unchecked

        // You pass in self as the tableViewCell so we can access it in the delegate method
        delegate?.tableViewCell(self, didChangeCheckboxToState: newState)
    }

}

在你的UITableViewController子类中:

class MyTableViewController: UITableViewController, MyTableViewCellDelegate {

    // Other methods here (viewDidLoad, viewDidAppear, etc)...

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) {
        var cell = tableView.dequeueReusableCellWithIdentifier("YourIdentifier", forIndexPath: indexPath) as MyTableViewCell

        // Other cell setup here...

        // Assign this view controller as our MyTableViewCellDelegate
        cell.delegate = self

        return cell
    }

    override func tableViewCell(tableViewCell: MyTableViewCell, didChangeCheckboxToState state: CheckboxState) {

        // You can now access your table view cell here as tableViewCell

    }

}

希望这有帮助!

答案 3 :(得分:0)

获取tableView在特定单元格上的单元格位置。调用一个函数,该函数持有单元格对象的手势,例如UIImage等。

let location = gesture.location(in: tableView)
   let indexPath = tableView.indexPathForRow(at: location)
   Print(indexPath.row)
   Print(indexPath.section)