我想实现一个自定义的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实施类似场景的最佳做法是什么?
答案 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)")
}