我的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
}
答案 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
}