我有一个带有多个部分的UITableView,在我的cellForRowAtIndexPath方法中,我将一个UITapGestureRecognizer添加到单元格的imageView(每个单元格都有一个小图像)。我通过使用:
成功访问了该图像(为了更改它)var imageView : UIImageView! = sender.view! as UIImageView
然而,我现在需要做的是访问单元格的数据,我相信这意味着我需要能够访问单元格以获取节和行号。任何人都可以建议如何做到这一点?我的想法是,如果任务完成,我将图像更改为未选中的复选框,但在我的数据中,我需要将该任务标记为已完成。
答案 0 :(得分:18)
在处理点按手势识别器的功能中,使用tableView
的{{1}}功能获取触摸事件的可选索引路径,如下所示:
indexPathForRowAtPoint
从这里开始,您可以调用func handleTap(sender: UITapGestureRecognizer) {
let touch = sender.locationInView(tableView)
if let indexPath = tableView.indexPathForRowAtPoint(touch) {
// Access the image or the cell at this index path
}
}
来获取单元格或其任何内容,因为您现在拥有已敲击单元格的索引路径。
答案 1 :(得分:6)
您可以获取图像的位置,以便找到indexPath并从那里找到具有该图像的单元格:
var position: CGPoint = sender.locationInView(self.tableView)
var indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(position)!
var cell = self.tableView(tableView, cellForRowAtIndexPath: indexPath)
答案 2 :(得分:2)
您错过了可以在此处使用代表设计模式。
创建一个协议,告诉代表您的复选框(imageView)中的状态更改:
enum CheckboxState: Int {
case .Checked = 1
case .Unchecked = 0
}
protocol MyTableViewCellDelegate {
func tableViewCell(tableViewCell: MyTableViewCell, didChangeCheckboxToState state: CheckboxState)
}
假设你有一个UITableViewCell
子类:
class MyTableViewCell: UITableViewCell {
var delegate: MyTableViewCellDelegate?
func viewDidLoad() {
// Other setup here...
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "didTapImage:")
imageView.addGestureRecognizer(tapGestureRecognizer)
imageView.userInteractionEnabled = true
}
func didTapImage(sender: AnyObject) {
// Set checked/unchecked state here
var newState: CheckboxState = .Checked // depends on whether the image shows checked or unchecked
// You pass in self as the tableViewCell so we can access it in the delegate method
delegate?.tableViewCell(self, didChangeCheckboxToState: newState)
}
}
在你的UITableViewController
子类中:
class MyTableViewController: UITableViewController, MyTableViewCellDelegate {
// Other methods here (viewDidLoad, viewDidAppear, etc)...
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) {
var cell = tableView.dequeueReusableCellWithIdentifier("YourIdentifier", forIndexPath: indexPath) as MyTableViewCell
// Other cell setup here...
// Assign this view controller as our MyTableViewCellDelegate
cell.delegate = self
return cell
}
override func tableViewCell(tableViewCell: MyTableViewCell, didChangeCheckboxToState state: CheckboxState) {
// You can now access your table view cell here as tableViewCell
}
}
希望这有帮助!
答案 3 :(得分:0)
获取tableView在特定单元格上的单元格位置。调用一个函数,该函数持有单元格对象的手势,例如UIImage等。
let location = gesture.location(in: tableView)
let indexPath = tableView.indexPathForRow(at: location)
Print(indexPath.row)
Print(indexPath.section)