【问题标题】:Get the IndexPath from inside a UITableViewCell subclass in Swift从 Swift 中的 UITableViewCell 子类中获取 IndexPath
【发布时间】:2014-11-10 02:59:07
【问题描述】:

我有一个自定义的 UITableViewCell 子类及其关联的 xib。我在这个单元格中有一个UILabel 和一个UIButton,我已将按钮的内部操作连接到子类。

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

因为我在 UITableViewCell 子类中,所以我不能使用像 this 这样的解决方案,因为我没有从单元子类内部对 tableview 的引用。经过进一步调查,我找到了another 解决方案,并像这样在 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 动态转换失败

知道我的代码有什么问题吗?

或者我愿意接受任何其他可以让我以任何其他方式达到预期结果的建议。

谢谢。

【问题讨论】:

  • 你知道相关indexPath的原因是什么? println("indexPath?.row") 显然不是真正的原因。这一切背后的模式是什么?
  • @POB 原因是我已经取出了tableview 的数据源方法,并将它们放在一个单独的可重用类中,如this 文章中所述。我的自定义单元格有一个按钮,现在我需要获取点击该按钮的单元格的索引路径。
  • @Isuru:几周前我回答了一个非常相似的问题here,但我不再认为这是一个好的应用程序设计。我认为您想要的是数据源(数组)中的索引,而不是单元格索引路径(结果相同,但第一个应用程序设计更好)。我们应该在数据源上构建模型,而不是懒惰地依赖单元格索引路径。
  • @POB 你是对的。我也有点意识到这一点,因为我真正想做的是具有该单元格中对象的属性的东西,而不是直接的索引路径。我要更改委托以返回索引。谢谢:)

标签: ios uitableview swift uibutton nsindexpath


【解决方案1】:

听起来你需要一个代表:

Delegates in 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 }
    

    在触摸方法中“sumbitOrContinue”-

     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)}
    

    【讨论】:

      【解决方案3】:

      UIButton.Type 确实没有 member superview,但是 sender 有

      var cell: UITableViewCell = sender.superview.superview as UITableViewCell

      【讨论】:

      • 如果使用嵌入在 tableview 中的集合视图并且您希望在集合视图单元格中启用按钮交互但仍允许嵌入集合视图单元格与正确的 tableview 项目
      猜你喜欢
      • 1970-01-01
      • 2014-09-25
      • 2014-07-27
      • 1970-01-01
      • 2012-10-24
      • 2013-03-20
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      相关资源
      最近更新 更多