通过单击swift中的按钮设置所选行

时间:2017-09-17 15:00:27

标签: ios swift

我有一个表格视图,单元格有一个按钮。 我想当我点击哪一行按钮,当前行选中。 (我的意思是行按钮在其中)。

我写下面的代码,但它只选择第一行:

@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)
}

什么是解决方案

1 个答案:

答案 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)
        }

        // ...

}

注意:您也可以使用代理。

它也会起作用:)