Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 检测单元内UILabel上的点击_Ios_Swift_Uitableview_Uitapgesturerecognizer - Fatal编程技术网

Ios 检测单元内UILabel上的点击

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) 我想让它在用户点击时改变

我在标签上有一个UITapGestureRecognitor,如下所示:

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()
,我指的是注释中指出的手势识别器,这不适用于可重复使用的单元格。一旦重新使用单元,单元将收回原始数据