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

时间:2017-06-21 02:05:11

标签: ios swift xcode tableviewcell

我在单元格中有一个按钮作为切换来检查俱乐部中的成员。当我签入一个成员时,我需要按钮的状态在滚动后保持为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
}

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

5 个答案:

答案 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
}