如何传递与UITapGestureRecognizer关联的对象

时间:2015-02-20 20:46:05

标签: ios iphone uitableview swift uitapgesturerecognizer

我有一个CustomTableViewCell,其中有一个图像。此图片与 UITapGestureRecognizer 相关联。

当我单击此图像时,我需要将基于cell和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,但这个应用程序需要点击特定的单元格图像。

Schedulle有属性:

import Foundation
import CoreData

class Schedulle: NSManagedObject {

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

不是在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
}

答案 2 :(得分:0)

根据@someGuy和@backsquare,我会发布完整的答案:

我改为按钮而不是按钮。

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

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

2 - 我在自定义表格视图单元格中创建了var,以接收委托

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或TableViewController中,取决于你的情况,我实现了协议 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)
 }
}