UITableViewでチェックマークが繰り返し表示される場合の対応

otaguro 969views 更新:2015年6月2日

UITableViewCellはメモリ節約のためにインスタンスを使いまわしているので、スクロール時に新しいセルが読み込まれる都度、値を設定し直さないと、8個おきくらいで同じセルが表示されてしまいます。
例えば、次のようにプロパティに値を保持・読み込むようにすれば、問題なく動作するようになります。

    //  チェックされたセルの位置を保存しておく辞書をプロパティに宣言
    var selectedCells:[String:Bool]=[String:Bool]()
    //  スクロールして読み込んだ時に、チェックマークの状態を設定し直す
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.selectMemberTableView.dequeueReusableCellWithIdentifier("SelectMemberTableViewCell") as! SelectMemberTableViewCell

        let key = "\(indexPath.section)-\(indexPath.row)"
        if let selected = selectedCells[key]{
            cell.accessoryType=UITableViewCellAccessoryType.Checkmark
        }else{
            cell.accessoryType=UITableViewCellAccessoryType.None
        }

        return cell
    }
    //  セルをタップした時に、チェックマークを切り替える処理・辞書にチェックマークの状態を保存する処理
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) {
        var _cell=tableView.cellForRowAtIndexPath(indexPath)
        if let cell=_cell{

            let key = "\(indexPath.section)-\(indexPath.row)"

            if cell.accessoryType == UITableViewCellAccessoryType.None{
                cell.accessoryType=UITableViewCellAccessoryType.Checkmark
                selectedCells[key]=true;
            }else{
                cell.accessoryType=UITableViewCellAccessoryType.None
                selectedCells.removeValueForKey(key)
            }
        }
    }

参考: http://stackoverflow.com/questions/15610641/accessory-type-repeats-for-the-reused-cells-in-uitable-view

ログイン / 新規登録してコメントする

このソースコードをストックして後で利用したり、作業に利用したソースコードをまとめることができます。

こちらもお役に立つかもしれません