2017-06-21 83 views
0

我在单元格中有一个按钮作为切换到俱乐部成员的切换。当我检查一个成员时,我需要按钮的状态在滚动后保持ON状态,但它会关闭。这里是cellForRow方法:iOS Swift:在单元格中维护切换按钮状态

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

Shamas强调了一个正确的方法来做到这一点,所以我会分享我的整个解决方案。

我创建一个单独的类来存储检查单元的阵列:

class Utility { 

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

var checkedCells = [Int]() 

在定制单元I类已经操作方法连接到复选按钮来添加和删除检查细胞:

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

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

您需要跟踪选择了哪些单元格。也许在你的成员班里。然后当你在你的cellForRowAt你应该检查这个单元格是否已被选中,并为你的按钮设置正确的状态。

+0

谢谢你的帮助,这是一个正确的方法,但实际的代码有点涉及,所以我总是做出正确的答案是完整的答案。我因为这个原因接受了我的回答。再次感谢你。 – fullMoon

0

的问题是这里:每单元被配置委托cellForRowAt时调用时间

checkBtn.isSelected = !checkBtn.isSelected 

此代码将反映所述按钮选择的状态。所以如果您之前选择了它,现在它变成未选中。

2

这是因为tableview重用了你的单元格。所以你必须按照tableView数据源维护按钮。

0

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