我有带TableView的ViewController。 TableView是动态的,并且有一个带有Button的自定义单元格。单元格的数量取决于api。
因此,每个单元格都包含从api传递的一些信息,并且每个单元格都有一个INFO按钮。 默认情况下,我设置
->andWhere(['IS NOT', 'column_name', null]); // check on null
当用户点击一个单元格
Btninfo.isUserInteractionEnabled = false
通过这种方法,在用户选择单元格之前不会选择按钮,并且一旦用户选择了单元格,便会从该单元格获取信息,而使用单元格的indexPath.row获取其他一些细节。 然后,该“信息”按钮将打开一个弹出窗口,显示该单元格内部内容的详细信息。
现在是问题:-
一旦用户选择了任何单元格,Btninfo就会启用,并且将从该单元格中获取信息。现在,如果用户在另一个单元格中单击“信息”按钮而不选择该单元格,则弹出窗口将显示从上一个单元格中获取的详细信息。
那么,如何仅对所选单元格启用按钮,而对其他单元格禁用按钮?并禁用该单元格中的按钮,并在下一个用户选择的单元格中启用它?
(我知道我可以禁用didDeselect上的单元格,而我不问这个问题)
答案 0 :(得分:3)
在自定义UITableViewCell
本身中进行处理。
要基于单元格选择启用/禁用Btninfo's
userInteraction,请覆盖setSelected(_:, animated:)
中的UITableViewCell
方法。
要禁用Btninfo's
userInteraction,请在重用单元格时,使用prepareForReuse()
方法将其禁用。
这就是我要说的,
class CustomCell: UITableViewCell {
@IBOutlet weak var Btninfo: UIButton!
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
self.Btninfo.isUserInteractionEnabled = selected
}
override func prepareForReuse() {
super.prepareForReuse()
self.Btninfo.isUserInteractionEnabled = false
}
}
setSelected(_:, animated:)
方法将自动处理所有Btninfo's
中的isUserInteractionEnabled
cells
,即在选定的cell
中将启用它,而在其他{ {1}}将禁用它。您无需使用cells
方法做任何事情。
答案 1 :(得分:1)
我现在在我的代码中正在使用类似的东西。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! Cell
cell.Btninfo.isUserInteractionEnabled = cell.isSelected
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) as? Cell {
cell.Btninfo.isUserInteractionEnabled = true
}
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) as? Cell {
cell.Btninfo.isUserInteractionEnabled = false
}
}
答案 2 :(得分:1)
您已采用一组模型类,例如arrData: [Data] = []
在表视图中显示数据。
请在模型类中添加额外的变量,例如isAbleToEnable = false
,用于显示该数据。
模型类如下:
Class Data {
….
{Your Content}
….
var isAbleToEnable = false
}
现在使用tableview方法,执行以下操作
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.arrData[indexPath.row].isAbleToEnable = true
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! Cell
If self.arrData[indexPath.row].isAbleToEnable {
cell.Btninfo.isUserInteractionEnabled = true
//do stuff
} else {
cell.Btninfo.isUserInteractionEnabled = false
}
}