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

Posted

技术标签:

【中文标题】CustomCell(TableView)中的Swift Button将参数传递给targetMethod【英文标题】:Swift Button inside CustomCell (TableView) passing arguments to targetMethod 【发布时间】:2016-07-18 16:46:25 【问题描述】:

我的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


【问题讨论】:

【参考方案1】:

首先,对象 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

【讨论】:

谢谢,这很好用。我不得不更改协议签名:protocol CustomCellDelegate func cellButtonTapped(cell: DemoCell) to (sender: AnyObject) 和 func cellButtonTapped(AnyObject: sender) 到 func cellButtonTapped( sender: AnyObject)【参考方案2】:

关闭。我不会使用 Suresh 的方法,因为它无助于查找 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

【讨论】:

谢谢,但我在这里得到了 indexPath 的 nil 值。 Sureshs 方法在进行了一些小的更改后仍然有效,所以我同意了 DemoCell 应该是 UITableViewCell 我的方法工作。 (去掉子类参数)@user2039697

以上是关于CustomCell(TableView)中的Swift Button将参数传递给targetMethod的主要内容,如果未能解决你的问题,请参考以下文章

在 tableView 上使用 CustomCell,如何调用 didSelectRowAtIndexPath?

customCell 中的 UITableView 隐藏一个按钮也隐藏其他单元格的下一个按钮

将图像动态分配给 CustomCell

访问 tableView SWIFT 中的文本字段

'NSInternalInconsistencyException',原因:'NIB数据无效。'对于CustomCell

在UITableView中滚动时,CustomCell图像会发生变化