CustomCell(TableView)中的Swift Button将参数传递给targetMethod

时间:2016-07-18 16:46:26

标签: ios swift uibutton tableview custom-cell

我的TableView功能自定义单元格,其中有一个按钮可在另一个视图中显示相应的详细信息。 这个帖子让我开始了,我试着用customCell里面的委托来实现这个方法: How to access the content of a custom cell in swift using button tag?

我想要实现的是,当我点击按钮时,它会读取单元格的名称并将其传递给下一个控制器。但是,我似乎无法使用委托方法传递名称,其字段为nil

如何在点击按钮时获取单元格的具体内容?

这是我到目前为止所做的:

在创建我自己的单元格的类中,我设置了委托:

protocol CustomCellDelegate {
 func cellButtonTapped(cell: DemoCell)
}
(........)
 var delegate: CustomCellDelegate?

@IBAction func buttonTapped(sender: AnyObject) {
    delegate?.cellButtonTapped(self)
}

TableViewController我有以下内容:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath
    indexPath: NSIndexPath) -> UITableViewCell {
    let cell =
        tableView.dequeueReusableCellWithIdentifier("FoldingCell",
                                                    forIndexPath: indexPath) as! DemoCell
    cell.delegate = self

 //TODO: set all custom cell properties here (retrieve JSON and set in cell), use indexPath.row as arraypointer

    let resultList = self.items["result"] as! [[String: AnyObject]]
    let itemForThisRow = resultList[indexPath.row]

    cell.schoolNameClosedCell.text = itemForThisRow["name"] as! String
    cell.schoolNameOpenedCell.text = itemForThisRow["name"] as! String

    self.schoolIdHelperField = itemForThisRow["name"] as! String

    cell.schoolIntroText.text = itemForThisRow["name"] as! String

  //call method when button inside cell is tapped
    cell.innerCellButton.addTarget(self, action: #selector(MainTableViewController.cellButtonTapped(_:)), forControlEvents: .TouchUpInside)

    cell.school_id = itemForThisRow["name"] as! String

  //  cell.schoolIntroText.text = "We from xx University..."
    return cell
}

最后点击单元格内按钮时的目标方法

func cellButtonTapped(cell: DemoCell) {
    print("the school id: ")
    print(cell.schoolNameOpenedCell) //this line throws an error EXC_BAD_ACCESS 0x0

}

2 个答案:

答案 0 :(得分:2)

首先,对象 innerCellButton 不是Cell,它是一个按钮。解决问题的简单方法是,只需参考按钮的索引即可。请找到以下方法。

func cellButtonTapped(AnyObject: sender) {

  let resultList = self.items["result"] as! [[String: AnyObject]]
  //Get the tag value of the selected button. 
  //Button tag should be matching with the corresponding cell's indexpath.row
  let selectedIndex = sender.tag
  let itemForThisRow = resultList[selectedIndex]
  print("the school id: \(itemForThisRow[\"name\"])")

}

*并将每个按钮的标记设置为indexPath.row *

如,

override func tableView(tableView: UITableView, cellForRowAtIndexPath
indexPath: NSIndexPath) -> UITableViewCell {

// Dequeue your cell and other code goes here.

// set the button's tag like below.
cell.innerCellButton.tag = indexPath.row
return cell
}

答案 1 :(得分:0)

关闭。我不会使用Suresh的方法,因为它无法帮助找到包含section和row的IndexPath。

首先,我会为您的表视图数据源推荐一个模型对象。了解有关MVC模式的更多信息,以及使用映射解析对象的JSON响应。但是,这会为您提供所需的数据。

func cellButtonTapped(cell: UITableViewCell) {
    let indexPath = tableView.indexPathForCell(cell)
    let resultList = self.items["result"] as! [[String: AnyObject]]
    let itemForThisRow = resultList[indexPath.row]
    let name = itemForThisRow["name"] as! String
}