我有一个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
}
答案 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)
}
}