iOS Swift: 在单元格中维护切换按钮状态

iOS Swift: Maintaining Toggle Button State In A Cell

我在单元格中有一个按钮作为切换按钮,用于签入俱乐部中的成员。当我登记会员时,我需要按钮的状态在滚动后保持打开状态,但它又会关闭。这是 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
}

这是自定义单元格 class 中我切换按钮的部分

@IBOutlet weak var checkBtn: UIButton!
@IBAction func setAttendance(_ sender: Any){
    // toggle state
    checkBtn.isSelected = !checkBtn.isSelected
}

切换有效,但在滚动 table 后,按钮状态变回原始状态。任何建议表示赞赏。

发生这种情况是因为您重复使用了单元格。

您需要跟踪哪些单元格已被选中。也许在您的会员 class 中。然后,当您在 cellForRowAt 中时,您应该检查之前是否已选择此单元格并为您的按钮设置正确的状态。

问题在这里:

checkBtn.isSelected = !checkBtn.isSelected

每当委托 cellForRowAt 调用时,每次配置单元格时,此代码都会反映按钮选择状态。所以如果你之前选择了它,现在变成未选择。

这是因为 tableview 正在重复使用您的单元格。所以你必须根据 tableView 数据源维护按钮。

由于 tableView 正在重复使用单元格,因此您的代码将无法正常工作。 您必须在选择时跟踪每个按钮,并在滚动时 tableview 重用单元格时再次设置它。 解决方案:您可以采用一个数组(包含布尔值),它是您的表视图数据的大小。 所以你必须使用数组设置按钮的状态,并在选择或取消选择时更新数组。

Shamas 强调了一个正确的方法,所以我将分享我的整个解决方案。

我创建了一个单例 class 来存储一组选中的单元格:

class Utility {

// Singleton
private static let _instance = Utility()
static var Instance: Utility{
    return _instance
}

 var checkedCells = [Int]()

在自定义单元格中 class 我将操作方法​​连接到检查按钮以添加和删除选中的单元格:

@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
}