通过单击 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 中的按钮设置选定的行的主要内容,如果未能解决你的问题,请参考以下文章

单击编辑按钮时,Kendoui Grid 获取选定的行 ID

Angular Ag-Grid:单击按钮时撤消选定的行更改

视图中的按钮未单击 ios swift

存储选定的行 ID

如何将单击/选定的行数据从一个表传递到并排放置的另一个表

使用 DOM 按钮更改选择 HTML 元素中的选定值 单击 select2.js