通过单击 swift 中的按钮设置选定的行
Posted
技术标签:
【中文标题】通过单击 swift 中的按钮设置选定的行【英文标题】:set selected row by clicking button in swift 【发布时间】:2017-09-17 15:00:27 【问题描述】:我有一个按钮的表格视图和单元格。 我想当我点击哪一行的按钮时,当前行被选中。 (我的意思是行按钮在里面)。
我写了下面的代码,但它只选择了第一行:
@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)
什么是解决方案
【问题讨论】:
How can I get indexPath.row in cell.swift的可能重复 【参考方案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)
// ...
注意:您也可以使用委托。
它也会起作用:)
【讨论】:
您不应该使用标签来跟踪表格视图中按钮的索引路径。如果表格视图允许您插入、删除或移动任何行,它将失败。 好吧,OP 没有说他是否会实施单元插入/删除,所以我想我会给他一些不同的解决方案,以便他可以选择最适合他的需求的解决方案: )。 没关系。我只是为寻求解决方案的未来读者指出一个潜在问题。 谢谢!嗯,这实际上非常相关,因为根据具体情况,它可能确实会破坏交易。以上是关于通过单击 swift 中的按钮设置选定的行的主要内容,如果未能解决你的问题,请参考以下文章