如何在自定义UITableViewCell中访问按钮的索引路径?

时间:2015-04-18 19:57:46

标签: ios uitableview swift button

我创建了一个自定义TableViewCell,并且当前在单元格中放置了一个按钮。按下按钮时,在tableviewcell.swift文件中,IBAction func将被执行。我无法弄清楚如何确定按下按钮所在的单元格的索引路径。我试图使用以下

    @IBAction func employeeAtLunch(sender: AnyObject) {

    let indexPath = (self.superview as! UITableView).indexPathForCell(self)
    println("indexPath?.row")
}

但点击时出现以下错误:  Could not cast value of type 'UITableViewWrapperView' to 'UITableView'

有关如何访问单元格索引路径的任何帮助?

3 个答案:

答案 0 :(得分:4)

你只是假设单元的直接超级视图是表视图 - 错误地。没有特别的理由说明为什么会这样(事实上并非如此)。使用更少的假设!您需要继续前进超级视图链,直到您 到达表格,如下所示:

var v : UIView = self
do { v = v.superview! } while !(v is UITableView)

现在v是表视图,您可以继续计算出它是哪一行。

然而,我实际上要做的就是努力工作,不是从细胞到桌子,而是从按钮到细胞。技术完全相同:

var v : UIView = sender as! UIView
do { v = v.superview! } while !(v is UITableViewCell)

执行按钮的操作方法,其中sender是按钮。如果action方法的目标是表视图控制器,则它可以访问该表,问题就解决了。

答案 1 :(得分:4)

您可以在单元格中使用其行的属性对UIButton进行子类化。

class MyButton: UIButton {
    var row: Int?
}

然后,当您设置表格视图时,在cellForRowAtIndexPath方法中设置row属性:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // ...
        cell.button.row = indexPath.row
        // ...
    }

这样,当动作触发时,您可以获得正确的行:

@IBAction func employeeAtLunch(sender: MyButton) {
    if let row = sender.row {
        // access the row
    }
}

答案 2 :(得分:0)

在您的情况下,我会在您的按钮上添加一个标签,以确定它在哪一行。每当我在回调cellForRowAtIndexPath中配置单元格时,我都会更新此标记值。

单击按钮时,处理程序始终指定按下的按钮。将标签定义为按下的按钮,您可以知道按下哪一行的按钮。

@IBAction func buttonPressed(sender: AnyObject) {
      //convert to UIButton
      if let btn = sender as? UIButton {
           let rowId = btn.tag
           //do your works
      }
}

如果您的tableview包含多个部分,则必须以正确的方式设置标记的值。

第二个更好的解决方案:获取tableView中按钮的位置,然后在tableview中获取该位置的索引路径:

let position = sender.convertPoint(CGPointZero, toView: self.tblMain)
let indexPath = self.tblMain.indexPathForRowAtPoint(position)