检测单元格内的UILabel上的点击

时间:2017-01-27 19:48:08

标签: ios swift uitableview uitapgesturerecognizer

我在标签上有一个UITapGestureRecognizer:

cell.label.userInteractionEnabled = true
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.labelTapped))
cell.label.addGestureRecognizer(gestureRecognizer)

我想让它在用户点击它时更改文字。在Stackoverflow上寻找答案几个小时后,我已达到可以更改标签文本的位置。但它也会更改其他单元格标签上的文本。这是我实施的内容:

 func labelTapped(recognizer: UIGestureRecognizer){
        print(“Label tapped.")

        let position: CGPoint =  recognizer.locationInView(self.tableView)
        let indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(position)!
        let cell = self.tableView.cellForRowAtIndexPath(indexPath) as! DataTableViewCell

        cell.label.text = “Test."
    }

帮我找到解决方案。

3 个答案:

答案 0 :(得分:3)

我建议将DataSource更改为已经提到过的Sneak。然后,您可以在指定的IndexPaths处重新加载tableView以获得所需的结果:

func handleLabelTap(sender: UIGestureRecognizer) {
    // Get references
    guard let label = sender.view as? UILabel else {
        print("Error not a label")
        return
    }
    let position = sender.location(in: self.tableView)
    guard let index = self.tableView.indexPathForRow(at: position) else { 
        print("Error label not in tableView")
        return
     }

    // Notify TableView of pending updates
    self.tableView.beginUpdates()
    defer { self.tableView.endUpdates() }

    // Alter Datasource
    self.data[index.row] = "Changed Value"
    self.tableView.reloadRows(at: [index], with: .automatic)
}

其中self.data是表示您的DataSource的String数组。

编辑:评论中建议的Swift 2.3版本。

func handleLabelTap(sender: UIGestureRecognizer) {
    // Get references
    guard let label = sender.view as? UILabel else {
        print("Error not a label")
        return
    } 
    let position = sender.locationInView(self.tableView) 
    guard let index = self.tableView.indexPathForRowAtPoint(position) else { 
        print("Error label not in tableView")
        return
    } 

    // Notify TableView of pending updates
    self.tableView.beginUpdates() 
    defer { self.tableView.endUpdates() } 

    // Alter DataSource
    self.data[index.row] = "Changed Value" 
    self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: .Automatic)
}

答案 1 :(得分:0)

细胞是可重复使用的。这意味着当您更改单元格上的值时,它将被更改并在该特定单元格标识符的所有重用上保持更改,直到您将其更改为止。

要解决您的问题,您可以在cellForRowAtIndexPath中设置“占位符”/ DefaultText文本,或者如果您有子类您的单元格,则可以在 prepareForReuse <中设置defaultText /占位符/ strong>方法。

答案 2 :(得分:0)

您可以尝试这种方法:

func labelTapped(recognizer: UITapGestureRecognizer){
    let dataCell: DataTableViewCell =  recognizer.view as! DataTableViewCell
    let indexPath = tableView.indexPath(for: dataCell)
    data[(indexPath?.row)!] = "changed value "
    self.tableView.reloadData()
}