在使用自定义 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

新手教程之使用Xib自定义UITableViewCell

使用自动布局在自定义 UITableViewCell 上分页 UIScrollView

确保每个自定义 UITableViewCell 调整单元格高度?

在 iOS 中使用自定义单元格时无法查看 UITableViewCell