如何传递与 UITapGestureRecognizer 关联的对象

How to pass an object associated with UITapGestureRecognizer

我有一个 CustomTableViewCell,其中有一个图像。此图片与 UITapGestureRecognizer.

关联

当我点击这张图片时,我需要根据单元格和 indexPath 将对象传递给选择器,如下所示:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCellWithIdentifier("cellTotal") as TotalTableViewCell

  let schedulle = schedulleList[indexPath.row] as Schedulle

  let tap = UITapGestureRecognizer(target: self, action: "edit:")
  tap.numberOfTapsRequired = 1
  tap.numberOfTouchesRequired = 1

  //simulation code - here i need pass the object clicked
  tap.AssociatedObject = schedulle
  cell.imgSchedulleEdit.addGestureRecognizer(tap)

 return cell
}

func edit(sender: UITapGestureRecognizer) {

   //simulation code getAssociated Object
   let schedulle = sender.getAssociatedObject as Schedulle
}

我知道,这不好,我通常使用 didSelectRow,但是这个应用程序需要点击特定的单元格图像。

时间表有属性:

import Foundation
import CoreData

class Schedulle: NSManagedObject {

  @NSManaged var createdDate: NSDate
  @NSManaged var message: String
}

不使用 UIImageView,而是使用 UIButton,并使用按钮的方法 setImage(_:forState:) 来设置您的图像。然后您可以使用 addTarget 激活事件,这会将按钮的实例传递给操作。

不是在 dequeue 单元格方法中添加手势识别器,而是将其添加到 TotalTableViewCell 子类中,并将单元格作为目标,然后向您的视图控制器提供委托回调,按照 totalTableViewCellDidTapImage(cell: TotalTableViewCell)

现在,在您的视图控制器中,您可以使用

获取此行的索引路径
func totalTableViewCellDidTapImage(cell: TotalTableViewCell) {
    let indexPath = myTableView.indexPathForCell(cell)
    let schedulle = schedulleList[indexPath.row] as Schedulle
    // do stuff with schedulle
}

根据@someGuy 和@backsquare,我将 post 完整的答案:

我将按钮改为按钮。

1 - 我在自定义 table 视图单元格中定义了 协议

protocol SchedulleEdit : NSObjectProtocol{
  func totalTableViewCellEdit(cell: TotalTableViewCell)
}

2 - 我在自定义 table 视图单元格中创建了 var 以接收 delegate

protocol SchedulleEdit : NSObjectProtocol{
  func totalTableViewCellEdit(cell: TotalTableViewCell)
}

class TotalTableViewCell: UITableViewCell {

  var delegate : SchedulleEdit? = nil
 ...
} 

3 - 我定义了捕获选定单元格并将其发送到实现我们协议的视图控制器的函数。

protocol SchedulleEdit : NSObjectProtocol{
  func totalTableViewCellEdit(cell: TotalTableViewCell)
}

class TotalTableViewCell: UITableViewCell {

   var delegate : SchedulleEdit? = nil
  ...
 } 

 @IBAction func edit(sender: UIButton) {
   self.delegate?.totalTableViewCellEdit(self)

 }
}

4 - 在 ViewController 或表 ViewController 中,取决于你的情况,我实现了协议 SchedulleEdit:

class TotalViewController: UIViewController,UITableViewDataSource,UITableViewDelegate, SchedulleEdit{
  ...
}

5 - 在 cellForRowAtIndexPath 中,我将委托设置为:

class TotalViewController: UIViewController,UITableViewDataSource,UITableViewDelegate, SchedulleEdit{

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCellWithIdentifier("cellTotal") as TotalTableViewCell

   cell.delegate = self
   ...
 }

}

6 - 最后我实现了协议所需的方法:

class TotalViewController: UIViewController,UITableViewDataSource,UITableViewDelegate, SchedulleEdit{

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath:  NSIndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCellWithIdentifier("cellTotal") as TotalTableViewCell

   cell.delegate = self
   ...
 }

 func totalTableViewCellEdit(cell: TotalTableViewCell) {
   let indexPath = self.tblTotal.indexPathForCell(cell)
   let row = indexPath?.row
   let schedulle = self.schedulleList[row!] as Schedulle
   println(schedulle.message)
 }
}