在使用自定义 UITableViewCell 时检测 UIButton
Posted
技术标签:
【中文标题】在使用自定义 UITableViewCell 时检测 UIButton【英文标题】:Detect UIButton while using custom UITableViewCell 【发布时间】:2015-02-04 12:29:26 【问题描述】:我想实现一个自定义 UITableViewCell 类,它由标签、按钮和图像等子视图组成。这些单元格将显示使用 API 从 Web 获取的内容。
我不想实现 UITableView 委托方法didSelectRowAtIndexPath
,因为这会使整个单元格可选。只有单元格中的按钮才能触发任何操作。
按钮通过 IBOutlet 从情节提要连接到自定义 UITableViewCell。 addTarget(_:action:forControlEvents:)
方法在 UITableViewController 类的cellForRowAtIndexPath
中的 UIButton 上调用。
当我们要在按钮的Selector函数中检测选中单元格的indexPath
时,就会出现障碍。
这就是如何在 Selector 函数中检测所选单元格的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 中实现类似场景的最佳实践是什么?
【问题讨论】:
顺便说一下,您的发件人是AnyObject
类型,因此调用convertPoint:toView
而不将其转换为 UIView 会导致编译错误。
我同意。我以为我也会得到一个编译错误,但上面提到的@IBAction func
没有任何此类错误。虽然,将“发送者”设为UIView
类型会是一种相对更简洁的方法。
有趣。也许它不会给出编译错误,因为作为 AnyObject 的发送者完全有可能实现 convertPoint:toView 方法。
【参考方案1】:
一种方法是遍历发送方的超级视图并查看是否可以找到 UITableViewCell...
假设您创建了一个通用 UIView 扩展,该扩展使用一种方法来检查其父视图是否为 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)")
另一种方法是使用视图的 tag
属性,将其设置为 Int,然后检查发送者的 tag
在方法中的内容。
即在你的tableView:cellForRowAtIndexPath:
方法中
cell.myButton.tag = indexPath.row
然后在你的doSomething
方法中
let rowIndex = (sender as UIButton).tag
println("The row for this cell is - \(rowIndex)"
【讨论】:
【参考方案2】:如果你的tableView只有一个section,你可以使用按钮的tag
属性来存储indexPath.row
。
在cellForRowAtIndexPath
中,当你为按钮设置target-action时,设置button.tag = indexPath.row
。
然后在您的doSomething
例程中:
@IBAction doSomething(sender: UIButton)
println("This button is from row - \(sender.tag)")
【讨论】:
这种方法也有效。比我的方法简洁得多。以上是关于在使用自定义 UITableViewCell 时检测 UIButton的主要内容,如果未能解决你的问题,请参考以下文章
如何清除包含在重复使用的自定义 UITableViewCell 中的 WKWebview?
在使用自定义 UITableViewCell 时检测 UIButton
使用自动布局在自定义 UITableViewCell 上分页 UIScrollView