我有一个带有自定义 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/