Ios 检测单元内UILabel上的点击
我在标签上有一个UITapGestureRecognitor,如下所示:Ios 检测单元内UILabel上的点击,ios,swift,uitableview,uitapgesturerecognizer,Ios,Swift,Uitableview,Uitapgesturerecognizer,我在标签上有一个UITapGestureRecognitor,如下所示: cell.label.userInteractionEnabled = true let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.labelTapped)) cell.label.addGestureRecognizer(gestureRecognizer) 我想让它在用户点击时改变
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."
}
帮助我找到解决方案。单元格可以重复使用。这意味着,当您更改单元格上的值时,它将被更改,并且在重新使用该特定单元格标识符时保持更改,直到您将其更改回来
要解决您的问题,您可以在cellForRowAtIndexPath中设置“占位符”/“默认文本文本”,或者如果您的单元格有子类,则可以在prepareForReuse方法中设置默认文本/占位符 细胞可重复使用。这意味着,当您更改单元格上的值时,它将被更改,并且在重新使用该特定单元格标识符时保持更改,直到您将其更改回来
要解决您的问题,您可以在cellForRowAtIndexPath中设置“占位符”/“默认文本文本”,或者如果您的单元格有子类,则可以在prepareForReuse方法中设置默认文本/占位符 您可以尝试以下方法:
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()
}
您可以尝试以下方法:
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()
}
我建议按照前面提到的方法更改数据源。然后,可以在指定的IndExpath处重新加载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
是表示数据源的字符串数组
编辑:评论中建议的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)
}
我建议按照前面提到的方法更改数据源。然后,可以在指定的IndExpath处重新加载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
是表示数据源的字符串数组
编辑:评论中建议的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)
}
您是否尝试将sender参数添加到手势识别器目标动作?您可以检查发送方是否是UILabel,并仅修改该实例。iOS单元格可重复使用。在显示每个单元格时,您必须检查标签是否被点击。@Emptyless我相信
recognizer:uigesturecognizer
可以作为发送者。但是如何检查发件人是否是UILabel?你的意思是说这里没有使用cell
和indexath
来检测特定的单元格吗?这对你有用吗:@Caleb我用哪种方法签入它?cellforrowatinexpath
可以吗?如果是,我如何检测标签是否已在cellForRowAtIndexPath
中点击?您是否尝试将sender参数添加到手势识别器目标动作?您可以检查发送方是否是UILabel,并仅修改该实例。iOS单元格可重复使用。在显示每个单元格时,您必须检查标签是否被点击。@Emptyless我相信recognizer:uigesturecognizer
可以作为发送者。但是如何检查发件人是否是UILabel?你的意思是说这里没有使用cell
和indexath
来检测特定的单元格吗?这对你有用吗:@Caleb我用哪种方法签入它?cellforrowatinexpath
可以吗?如果是这样,我如何检测标签是否已在CellForRowatineXpath
中点击?我不太确定“它将被更改,并在所有重用中保持更改状态”。。如果您的数据源已更改,并且您将表格视图单元格从视图中滚动出去,例如,当您返回时,cellForRow
将再次调用,并且很可能您的单元格配置代码在该方法中,因此单元格的子视图将使用您提供的任何数据进行设置。@StephenPaul他正在直接更改文本,如果您查看他的代码,他没有更新任何数据源,更新的文本也没有在他的数据源中引用。此外,他没有从任何数据源对label.text进行设置和赋值,他可能使用的是静态“占位符”。如果您只更改一次单元格属性的值,而您根本没有方法再次调用它,或者在cellForRow方法或prepareForReuse中更改它,那么您的单元格将以更改后的值结束。我不太确定“它将被更改,并且在所有重用中保持更改状态”。。如果您的数据源已更改,并且您将表格视图单元格从视图中滚动出去,例如,当您返回时,cellForRow
将再次调用,并且很可能您的单元格配置代码在该方法中,因此单元格的子视图将使用您提供的任何数据进行设置。@StephenPaul他正在直接更改文本,如果您查看他的代码,他没有更新任何数据源,更新的文本也没有在他的数据源中引用。此外,他没有从任何数据源对label.text进行设置和赋值,他可能使用的是静态“占位符”。如果您只更改一次单元格属性的值,而您根本没有方法再次调用它,或者在cellForRow方法或prepareForReuse中更改它,那么您的单元格将以更改后的值结束。正如注释中指出的,这对可重用单元格不起作用。一旦该单元格被重用,该单元格将收回原始数据源值。它在具有多个可重用单元格的日历中对我有效。这是两行代码,我认为值得一试下面是一个直接修改标签的示例:,也许你的单元格永远不会离开屏幕,因此永远不会被重用?我明白你的意思,但这是一个持久存储和如何更新数据的问题。他面临的问题是只更新一个标签,而不是更改其他单元格的文本。在我的日历中,我更新核心数据,然后使用NSFetchedResultsController
delegate方法controllerdChangeContent
@Emptyless更新核心数据,然后reloadData()
,我指的是注释中指出的手势识别器,这不适用于可重复使用的单元格。一旦重新使用单元,单元将收回原始数据