我创建了一个自定义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'
有关如何访问单元格索引路径的任何帮助?
答案 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)