【问题标题】:How to access index path of button in a custom TableViewCell?如何访问自定义 TableViewCell 中按钮的索引路径?
【发布时间】:2015-06-25 15:46:24
【问题描述】:

我创建了一个自定义TableViewCell,并且当前在单元格中放置了一个按钮。当按下按钮时,在tableviewcell.swift 文件中,IBAction func 被执行。我无法弄清楚如何确定按下按钮所在的单元格的索引路径。我试图使用以下

    @IBAction func employeeAtLunch(sender: AnyObject) {

    let indexPath = (self.superview as! UITableView).indexPathForCell(self)
    println("indexPath?.row")
}

但我在点击时收到以下错误: Could not cast value of type 'UITableViewWrapperView' to 'UITableView'

关于如何访问单元格的索引路径的任何帮助?

【问题讨论】:

  • 您应该创建一个插座并将其连接到您的 tableView IBOutlet var tableView: UITableView! (您需要从方法中删除覆盖)

标签: ios uitableview swift button


【解决方案1】:

您可以将单元格中的UIButton 子类化,并为其行设置一个属性。

class MyButton: UIButton {
    var row: Int?
}

然后当您设置表格视图时,在cellForRowAtIndexPath 方法中,您设置row 属性:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // ...
        cell.button.row = indexPath.row
        // ...
    }

这样当动作触发时,你可以得到正确的行:

@IBAction func employeeAtLunch(sender: MyButton) {
    if let row = sender.row {
        // access the row
    }
}

【讨论】:

  • 你的意思是 var row: Int?
【解决方案2】:

在您的情况下,我将在您的按钮上添加一个标签,以确定它在哪一行。每当我在回调cellForRowAtIndexPath 中配置单元格时,我都会更新此标记值。

单击按钮时,处理程序始终指定按下的按钮。使用为按下的按钮定义的标签,您可以知道按下了哪一行的按钮。

@IBAction func buttonPressed(sender: AnyObject) {
      //convert to UIButton
      if let btn = sender as? UIButton {
           let rowId = btn.tag
           //do your works
      }
}

如果您的 tableview 有超过 1 个部分,则必须以正确的方式设置标签的值。

第二种更好的解决方案:在tableView中获取按钮的位置,然后在tableview中获取该位置的indexpath:

let position = sender.convertPoint(CGPointZero, toView: self.tblMain)
let indexPath = self.tblMain.indexPathForRowAtPoint(position)

【讨论】:

  • 对不起,t 太低了。
  • 是的,我明白你想说什么。我对 C# 感到困惑。刚刚修好了。我还添加了另一个解决方案
  • 虽然使用 UIView 的 tag 属性很快捷,并且可以完成这项工作,但它是 not considered a good practice,因为它通常用于跟踪视图。此外,随着代码库变得越来越复杂,跟踪此类任意决策变得越来越困难。
【解决方案3】:

您只是假设单元格的直接超级视图是表格视图 - 错误。没有什么特别的理由应该如此(事实上并非如此)。使用更少的假设!您需要继续向上超级视图链,直到您确实到达桌子,如下所示:

var v : UIView = self
do { v = v.superview! } while !(v is UITableView)

现在v 是表格视图,您可以继续计算这是哪一行。

然而,我实际上会做的是,不是从单元格到表格,而是从按钮到单元格。技术完全一样:

var v : UIView = sender as! UIView
do { v = v.superview! } while !(v is UITableViewCell)

执行按钮的操作方法,其中sender 是按钮。如果action方法的目标是table view controller,它就可以访问table,问题就解决了。

【讨论】:

  • 我不确定依赖视图层次结构来完成这些任务通常是否安全,因为内部结构随时可能发生变化。最后一个值得注意的变化是在 iOS 6 和 7 之间(example),我记得它给我带来了很多麻烦。
  • 但这就是我的意思。我们知道这个东西是那个东西在某个级别的子视图,这就是我们所知道的全部。像我在这里做的那样,以一种不张扬的方式走路从不休息。
  • 好的,再读一遍,我明白你的意思了。 :) 使用更少的假设绝对是一个合理的建议。不过,这仍然不是我解决这个特定问题的方式。
  • @JózsefVesza 好吧,没关系。接近的方法不止一种。这不会让我走错路。从 iOS 3.2 开始我就一直这样做,而且它从未损坏过。遍历层次结构是 iOS 编程中的一项主要技术。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多