ios - 单击单元格中的按钮时访问所有单元格

标签 ios swift uitableview

我有一个带有自定义 UITableViewCell 的 UITableView。每个单元格中都有一个按钮,我想在单击一个按钮时使所有按钮都不可单击。访问包含单击按钮的单元格很容易,但我还需要访问所有其他单元格以使其按钮不可点击。

因此,当在一个单元格内单击一个按钮时,我需要遍历所有其他单元格...我找到了一种向上走层次结构的方法,以便在按钮操作方法中,我向上一层访问UITableView,从那里我可以访问每个单元格,从每个单元格我可以访问它们的按钮并编辑 isUserInteractionEnabled 属性。但是,让一个单元格访问 TableView 然后访问所有其他单元格似乎不是一个好习惯。

class AnswerCell2: UITableViewCell {

let answerTextButton: UIButton = {
        let answerButton = UIButton()
        answerButton.setTitle("initial text", for: .normal)
        return answerButton
    }()


override init(style: UITableViewCell.CellStyle, reuseIdentifier: String!) {

       answerTextButton.addTarget(self, action: #selector(answerClicked), for: .touchUpInside)

}

@objc func answerClicked(sender: UIButton) {
// HERE I CAN ACCESS EASILY THE CELL WHERE THE BUTTON WAS CLICKED 
// AND THEN USE THE TABLEVIEW TO ACCESS OTHER CELLS AND THEIR BUTTONS 
// BUT THIS IS NOT A NICE WAY
    }

所以我有一个解决方案,但我想要一个更好的方法来实现它。我在网上找到的所有解决方案都是关于如何访问单击按钮的单元格,但这个很简单,我需要的是访问其他单元格,我想尽可能避免在 answerClicked() 操作方法中这样做以便代码保持干净。

谢谢。

最佳答案

您可以在自定义UITableViewCell 中创建一个闭包,并在单元格 中按下按钮 时调用它,即

class TableViewCell: UITableViewCell {
    @IBOutlet weak var button: UIButton!
    var handler: (()->())?

    @IBAction func buttonClicked(_ sender: UIButton) {
        handler?()
    }
}

现在,在 tableView(_:cellForRowAt:) 方法中设置 closure 并使用 visibleCells 属性来启用/禁用 其他单元格中的按钮,即

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
    cell.textLabel?.text = arr[indexPath.row]
    cell.handler = {
        if let visibleCells = tableView.visibleCells as? [TableViewCell] {
            visibleCells.forEach({
                $0.button.isEnabled = ($0 === cell)
            })
        }

    }
    return cell
}

如果您想在重新加载时保持启用/禁用 按钮 状态,您需要存储在您的模型中。

关于ios - 单击单元格中的按钮时访问所有单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58539631/

相关文章:

swift - 如何调试我不能经常重新创建的东西?

swift - 让语句更清晰 : checking object for key in dictionary

iphone - 未调用 UITableView 委托(delegate)和数据源方法

ios - iOS 8 上的 UITableView 单元格宽度停留在 320pt

ios - Delphi XE10.2.3 iOS设备系统状态栏

javascript - 使用 ChocolateChip-UI 时试图摆脱地址栏

ios - 属性上的 Swift 扩展事件监听器

ios - swift 启用使用 copy() 或 unshare method()

ios - 从 UIImage 获取 CGImage 时出错

ios - tableView didSelectRowAtIndexPath 无法正常工作