我在单元格中有一个按钮作为切换来检查俱乐部中的成员。当我签入一个成员时,我需要按钮的状态在滚动后保持为ON,但它会关闭。这是cellForRow方法:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.membersTableVw.dequeueReusableCell(withIdentifier: "CellMembersForCoach", for: indexPath) as! CellMembersForCoach
let member = members[indexPath.row]
cell.setMember(member)
cell.cellController = self
return cell
}
以下是自定义单元格类中切换按钮
的部分@IBOutlet weak var checkBtn: UIButton!
@IBAction func setAttendance(_ sender: Any){
// toggle state
checkBtn.isSelected = !checkBtn.isSelected
}
切换有效,但在滚动表格后,按钮状态会变回原始状态。任何建议都表示赞赏。
答案 0 :(得分:4)
这是因为您正在重复使用单元格。
您需要跟踪已选择的单元格。也许在你的会员班上。然后当你在cellForRowAt
时,你应该检查之前是否选择了这个单元格,并为你的按钮设置正确的状态。
答案 1 :(得分:2)
这是因为tableview正在重复使用您的单元格。所以你必须按照tableView数据源维护按钮。
答案 2 :(得分:0)
问题在于:
checkBtn.isSelected = !checkBtn.isSelected
每次在委托cellForRowAt
调用时配置单元格时,此代码将反映按钮选择状态。因此,如果您之前选择它,现在它将变为未选中。
答案 3 :(得分:0)
由于tableView正在重用单元格,因此您的代码不起作用。 您必须在选中时跟踪每个按钮,并在滚动时重新使用tableview重新设置单元格时再次设置它。 解决方案:您可以获取一个数组(包含bool),该数组是tableview数据的大小。 因此,您必须在选择或取消选择时使用数组和更新数组设置按钮状态。
答案 4 :(得分:0)
Shamas强调了正确的方法,所以我将分享我的整个解决方案。
我创建了一个单例类来存储一个已检查单元格数组:
class Utility {
// Singleton
private static let _instance = Utility()
static var Instance: Utility{
return _instance
}
var checkedCells = [Int]()
在自定义单元格类中,我将操作方法连接到检查按钮以添加和删除已选中的单元格:
@IBOutlet weak var checkBtn: UIButton!
@IBAction func setAttendance(_ sender: Any){
// Get cell index
let indexPath :NSIndexPath = (self.superview! as! UITableView).indexPath(for: self)! as NSIndexPath
if !checkBtn.isSelected{
Utility.Instance.checkedCells.append(indexPath.row)
}else{
// remove unchecked cell from list
if let index = Utility.Instance.checkedCells.index(of: indexPath.row){
Utility.Instance.checkedCells.remove(at: index)
}
}
// toggle state
checkBtn.isSelected = !checkBtn.isSelected
}
在视图控制器的cellForRowAt方法中,我检查单元格行是否在数组中,并确定是否应该检查切换按钮:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.membersTableVw.dequeueReusableCell(withIdentifier: "CellMembersForCoach", for: indexPath) as! CellMembersForCoach
if Utility.Instance.checkedCells.contains(indexPath.row){
cell.checkBtn.isSelected = true
}
return cell
}