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 隐藏一个按钮也隐藏其他单元格的下一个按钮
'NSInternalInconsistencyException',原因:'NIB数据无效。'对于CustomCell