在Swift中,从UITableViewCell子类中获取IndexPath

21

我有一个自定义的UITableViewCell子类和相关的xib。在这个单元格中,我有一个UILabel和一个UIButton,我已经将按钮的touch up inside action与子类连接起来。

我需要的是当单元格中的按钮被点击时,获取带有该按钮的单元格的索引路径。并且可能通过委托或其他方式将其发送回视图控制器。

由于我在一个UITableViewCell子类内部,所以我不能像这样使用解决方案,因为我没有从单元格子类内部引用表格视图。经过进一步调查,我发现另一个解决方案,并在Swift中实现了它,如下所示。

import UIKit

class ContactCell: UITableViewCell {

    @IBOutlet weak var nameLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        selectionStyle = .None
    }

    @IBAction func callButtonPressed(sender: UIButton) {
        let indexPath = (self.superview as UITableView).indexPathForCell(self)
        println("indexPath?.row")
    }

}

但是当我点击按钮时,它会崩溃并显示一个错误消息,说Swift动态转换失败

你有什么想法,我的代码出了什么问题吗?

或者,如果有其他建议可以让我以其他方式实现所需的结果,我也非常乐意尝试。

谢谢。


听起来你需要一个代理:https://dev59.com/3WAf5IYBdhLWcg3w9mps - ullstrm
你知道相关的indexPath的原因是什么?“println(“indexPath?.row”)”显然不是真正的原因。所有这一切背后的模型是什么? - Imanou Petit
@POB的原因是我已经将tableview的数据源方法取出并放入一个单独的可重用类中,正如this文章所述。我的自定义单元格有一个按钮,现在我需要获取被点击按钮所在的单元格的indexpath。 - Isuru
1
@Isuru:我几周前在这里回答了一个非常相似的问题链接,但我不再认为这是一个好的应用程序设计。我认为你想要的是数据源(数组)中的索引,而不是单元格索引路径(相同的结果,但使用第一个更好的应用程序设计)。我们应该根据我们的数据源构建我们的模型,而不是懒惰地依赖于单元格索引路径。 - Imanou Petit
@POB 你说得对。我也意识到了,因为我实际想做的是与该单元格中对象的属性有关的事情,而不是直接使用indexpath。我将更改委托以返回索引。谢谢 :) - Isuru
3个回答

23
听起来你需要一个委托: Swift中的委托? 然后只需将单元格本身作为参数传递给委托,然后您可以轻松执行tableView.indexPathForCell(cellFromDelegateMethod)

2

你也可以使用按钮的“标签”属性。在表格代理方法cellForRowAt中,可以使用IndexPath.row来为按钮设置标签。以下是我尝试说明的示例:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// get ur cell nib .As it has a button
cell.startOrConntinuBtn.addTarget(self, action: #selector(sumbitOrContinue), for: .touchUpInside) 

cell.startOrConntinuBtn.tag = indexPath.row }

在触摸方法"submitOrContinue"中 -

 func sumbitOrContinue(sender: UIButton!) { 
let tag = sender.tag
// do what you want to do like this example

let detail = self.detailList[tag]
let vc  = self.storyboard?.instantiateViewController(withIdentifier: "mockExamInt") as! MockWindowVc
vc.detailId = detail.id
self.navigationController?.pushViewController(vc, animated: true)}

1
UIButton.Type确实没有superview成员,但是sender有。
var cell: UITableViewCell = sender.superview.superview as UITableViewCell

如果您在表视图中嵌入了集合视图,并且希望启用集合视图单元格内的按钮交互,但仍允许嵌入式集合视图单元格转换到正确的表视图项目,则这是一个很好的方法。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接