2017-06-21 13 views
0

私は、クラブ内のメンバーをチェックインするためにトグルとしてセル内にボタンを持っています。メンバーをチェックインすると、スクロール後にボタンの状態をオンにしておく必要がありますが、オフになります。ここで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は正しい方法を強調していたので、私はすべての解決策を共有します。

@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 
} 
:私はアクションメソッドにチェックセルを追加および削除するためのチェックボタンに配線されているカスタムセルクラスで

class Utility { 

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

var checkedCells = [Int]() 

は、私がチェックした細胞の配列を格納するシングルトンクラスを作成しました

ビューコントローラの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

問題はここにある:

checkBtn.isSelected = !checkBtn.isSelected 

このコードは、ボタンの選択状態にデリゲートcellForRowAtが呼び出したときにセルが設定されるたびに反映されます。したがって、前に選択した場合は、選択されていません。

2

これは、テーブルビューがセルを再利用しているためです。したがって、tableViewデータソースごとにボタンを維持する必要があります。

0

tableViewはセルを再利用しているので、コードは動作しません。 選択したときに各ボタンを追跡し、スクロールするときにtableviewがセルを再利用しているときに再度設定する必要があります。 解決方法:テーブルビューデータのサイズである配列(ブール値を含む)を取ることができます。 ボタンを選択したり、選択を解除すると、配列と更新配列を使ってボタンの状態を設定する必要があります。

関連する問題