使用自定义UITableViewCell时检测UIButton

时间:2015-02-04 12:29:26

标签: uitableview swift uibutton custom-cell

我想实现一个自定义的UITableViewCell类,它由子视图组成,例如标签,按钮和图像。这些单元格将使用API​​显示从Web获取的内容。

我不想实现UITableView委托方法didSelectRowAtIndexPath,因为这会使整个单元格可选。只有单元格中的按钮才能触发任何操作。

该按钮通过IBOutlet从故事板连接到自定义UITableViewCell。在UITutViewController类的addTarget(_:action:forControlEvents:)中的UIButton上调用cellForRowAtIndexPath方法。

当我们想要在按钮的选择器功能中检测所选单元格的indexPath时发生包版广告。

这是在选择器功能

中检测所选单元格的indexPath的方法
@IBAction func doSomething(sender: AnyObject) {
    var location: CGPoint = sender.convertPoint(CGPointZero, toView: self.tableView)
    var indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(location)!
    println("The indexPath for Selected Cell is - \(indexPath.row)")
}

虽然,这成功解决了我的问题,但我的问题是;

1)您是否找到了另一种方法可以使用UIButtons在自定义UITableViewCell中传递选定的单元格数据?

2)到目前为止,在Swift实施类似场景的最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

一种方法是迭代发件人的超级视图,看看是否可以找到UITableViewCell ......

假设你创建了一个通用的UIView扩展,其中包含一个方法,可以检查其superview的任何一个是否是UITableViewCell ......

extension UIView {
    func parentTableViewCell() -> UITableViewCell? {
        var view = self
        while let superview = view.superview {
            if let cell = superview as? UITableViewCell {
                return cell
            } else {
                view = superview
            }
        }
        return nil
    }
}

然后你可以做以下......

if let cell = (sender as UIView).parentTableViewCell() {
    let indexPath = tableView.indexPathForCell(cell)
    println("The row for this cell is - \(indexPath.row)")
}

另一种方法是通过将视图设置为Int来使用视图的tag属性,然后检查发件人tag在方法中的含义。

即。在tableView:cellForRowAtIndexPath:方法

cell.myButton.tag = indexPath.row

然后在您的doSomething方法

let rowIndex = (sender as UIButton).tag
println("The row for this cell is - \(rowIndex)"

答案 1 :(得分:1)

如果您的tableView只有一个部分,您可以使用该按钮的tag属性来存储indexPath.row

cellForRowAtIndexPath中,当您为按钮设置目标操作时,请设置button.tag = indexPath.row

然后在doSomething例行程序中

@IBAction doSomething(sender: UIButton) {
    println("This button is from row - \(sender.tag)")
}