gpt4 book ai didi

ios - 当元素被激活时如何获取indexpath.row?

转载 作者:行者123 更新时间:2023-11-30 10:34:06 25 4
gpt4 key购买 nike

我有一个带有按钮的表格 View ,我想在点击其中一个按钮时使用indexpath.row。这是我目前拥有的,但它始终是 0

var point = Int()
func buttonPressed(sender: AnyObject) {
let pointInTable: CGPoint = sender.convertPoint(sender.bounds.origin, toView: self.tableView)
let cellIndexPath = self.tableView.indexPathForRowAtPoint(pointInTable)
println(cellIndexPath)
point = cellIndexPath!.row
println(point)
}

最佳答案

giorashc 几乎得到了他的答案,但他忽略了单元格有一个额外的 contentView 层这一事实。因此,我们必须更深入一层:

guard let cell = sender.superview?.superview as? YourCellClassHere else {
return // or fatalError() or whatever
}

let indexPath = itemTable.indexPath(for: cell)

这是因为在 View 层次结构中,tableView 将单元​​格作为 subview ,这些 subview 随后拥有自己的“内容 View ”,这就是为什么您必须获取此内容 View 的 super View 才能获取单元格本身。因此,如果您的按钮包含在 subview 中而不是直接包含在单元格的内容 View 中,则您必须深入许多层才能访问它。

以上是一种这样的方法,但不一定是最好的方法。虽然它是实用的,但它假设了 Apple 从未记录过的有关 UITableViewCell 的详细信息,例如它的 View 层次结构。这将来可能会改变,并且上面的代码很可能因此表现出不可预测的行为。

由于上述原因,出于生命周期和可靠性原因,我建议采用另一种方法。本主题中列出了许多替代方案,我鼓励您向下阅读,但我个人最喜欢的是以下内容:

在单元类上保存闭包的属性,让按钮的操作方法调用它。

class MyCell: UITableViewCell {
var button: UIButton!

var buttonAction: ((Any) -> Void)?

@objc func buttonPressed(sender: Any) {
self.buttonAction?(sender)
}
}

然后,当您在 cellForRowAtIndexPath 中创建单元格时,您可以为闭包分配一个值。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! MyCell
cell.buttonAction = { sender in
// Do whatever you want from your button here.
}
// OR
cell.buttonAction = buttonPressed(closure: buttonAction, indexPath: indexPath) // <- Method on the view controller to handle button presses.
}

通过将处理程序代码移至此处,您可以利用已存在的 indexPath 参数。这是一种比上面列出的方法更安全的方法,因为它不依赖于未记录的特征。

关于ios - 当元素被激活时如何获取indexpath.row?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58455771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com