我有一个表格视图,单元格有一个按钮。 我想当我点击哪一行按钮,当前行选中。 (我的意思是行按钮在其中)。
我写下面的代码,但它只选择第一行:
@IBAction func btnShowAds(_ sender: Any) {
let indexPath = IndexPath(row: 0, section: 0)
tblMain.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
tblMain.delegate?.tableView!(tblMain, didSelectRowAt: indexPath)
}
什么是解决方案
答案 0 :(得分:1)
这里有一些可能性。 其中一个也是最简单的,就是使用标签。
要提供完整的解决方案,首先需要在cellForRowAtIndexPath
方法中为按钮添加标记。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: yourReuseIdentifier, for: indexPath) as! YourCustomCell
// Set your button tag to be equal to the indexPath.row:
cell.button.tag = indexPath.row
// Add a target to your button making sure that you return the sender like so:
cell.button.addTarget(self, action: #selector(handleButtonTapped(sender:)), for: .touchUpInside)
}
现在这就是handlerButtonTapped()
方法中的样子:
func handleButtonTapped(sender: UIButton) {
// Now you can easily access the sender's tag, (which is equal to the indexPath.row of the tapped button).
// Access the selected cell's index path using the sender's tag like so :
let selectedIndex = IndexPath(row: sender.tag, section: 0)
// And finally do whatever you need using this index :
tableView.selectRow(at: selectedIndex, animated: true, scrollPosition: .none)
// Now if you need to access the selected cell instead of just the index path, you could easily do so by using the table view's cellForRow method
let selectedCell = tableView.cellForRow(at: selectedIndex) as! YourCustomCell
}
另一种可能性是使用闭包。
创建UITableViewCell的子类:
class CustomTableCell: UITableViewCell {
var shouldSelectRow: ((CustomTableCell) -> Void)?
// MARK: User Interaction
@IBAction func handleDidTapButton(_ sender: UIButton) {
// Call your closure whenever the user taps on the button:
shouldSelectRow?(self)
}
}
现在您可以像这样设置cellForRowAtIndexPath
方法:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// ...
cell.shouldSelectRow = { (selectedCell) in
// Since you now know which cell got selected by the user, you can access via its index path:
let selectedIndex = self.tableView.indexPath(for: selectedCell)
// Do whatever you need using the selected cell here
self.tableView.selectRow(at: selectedIndex, animated: true, scrollPosition: .none)
}
// ...
}
注意:您也可以使用代理。
它也会起作用:)