gpt4 book ai didi

ios - 单击表格 View 单元格上的按钮时如何获取 indexPath.row?

转载 作者:搜寻专家 更新时间:2023-11-01 06:52:50 25 4
gpt4 key购买 nike

This is my app

你好,上图是我的待办事项列表应用程序的用户界面,现在我只想在单击 tableviewcell 中的详细信息按钮时显示项目的详细信息(第一个项目、第二个项目等)。因此,为了获取项目的属性,我需要知道我刚刚单击详细信息按钮的行的 indexPath

我尝试了 tableview 的一些属性,例如 didSelectRowAtindexPathForSelectedRow,但两者都不起作用。对于 didSelectRowAt 用户需要先点击该行然后点击详细信息按钮,这不是我想要的,indexPathForSelectedRow 对我不起作用。

最佳答案

此类问题的一个常见的通用解决方案是将按钮的 @IBAction 连接到单元格中的处理程序(而不是在 View Controller 中),然后使用委托(delegate)协议(protocol)模式,以便单元格可以在点击按钮时告诉表格。关键是当单元格执行此操作时,它将提供对自身的引用,然后 View Controller 可以使用该引用来确定适当的 indexPath(以及行)。

例如:

  • 为您的 UITableViewCell 子类提供一个协议(protocol):

    protocol CustomCellDelegate: class {
    func cell(_ cell: CustomCell, didTap button: UIButton)
    }
  • @IBAction 连接到单元格(不是 View Controller )并调用委托(delegate)方法:

    class CustomCell: UITableViewCell {
    weak var delegate: CustomCellDelegate?

    @IBOutlet weak var customLabel: UILabel!

    func configure(text: String, delegate: CustomCellDelegate) {
    customLabel.text = text
    self.delegate = delegate
    }

    @IBAction func didTapButton(_ button: UIButton) {
    delegate?.cell(self, didTap: button)
    }
    }
  • 显然,当创建单元格时,调用 configure 方法,除其他外,传递对自身作为委托(delegate)的引用:

    extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { ... }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
    let text = ...
    cell.configure(text: text, delegate: self)
    return cell
    }
    }
  • 最后,让委托(delegate)方法调用 indexPath(for:) 以确定相关单元格的索引路径:

    extension ViewController: CustomCellDelegate {
    func cell(_ cell: CustomCell, didTap button: UIButton) {
    guard let indexPath = tableView.indexPath(for: cell) else { return }

    // use `indexPath.row` here
    }
    }

另一种方法是使用闭包,但再次使用将按钮 @IBAction 挂接到单元格的相同通用模式,但让它调用闭包而不是委托(delegate)方法:

  • 定义带有闭包的自定义单元格,点击按钮时将调用该闭包:

    class CustomCell: UITableViewCell {
    typealias ButtonHandler = (CustomCell) -> Void

    var buttonHandler: ButtonHandler?

    @IBOutlet weak var customLabel: UILabel!

    func configure(text: String, buttonHandler: @escaping ButtonHandler) {
    customLabel.text = text
    self.buttonHandler = buttonHandler
    }

    @IBAction func didTapButton(_ button: UIButton) {
    buttonHandler?(self)
    }
    }
  • 当 TableView 数据源创建单元格时,提供一个处理程序闭包:

    extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { ... }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
    let text = ...
    cell.configure(text: text, buttonHandler: { [weak self] cell in // the `[weak self]` is only needed if this closure references `self` somewhere
    guard let indexPath = tableView.indexPath(for: cell) else { return }

    // use `indexPath` here
    })
    return cell
    }
    }

我个人更喜欢委托(delegate)协议(protocol)模式,因为它的扩展性更好,但这两种方法都有效。


请注意,在这两个示例中,我都刻意避免将 indexPath 保存在单元格本身(或更糟的是,“标记”值)中。通过这样做,如果稍后从表中插入和删除行,它可以防止您错位。


顺便说一句,我使用了相当通用的方法/闭包名称。在真实的应用程序中,您可能会为它们指定更有意义的名称,例如 didTapInfoButtondidTapSaveButton 等)以阐明功能意图。

关于ios - 单击表格 View 单元格上的按钮时如何获取 indexPath.row?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55972709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com