我在标签上有一个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."
}
帮我找到解决方案。
答案 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()
}