Swift3 テーブルをスクロールするとチェックマークが勝手につく場合の解決法

Swift3 テーブルをスクロールするとチェックマークが勝手につく場合の解決法

やりたいこと

ある値に合致した場合にのみテーブルで表示しているセルにチェックマークを付けたいがテーブルをスクロールするとチェックマークを付けたいセル以外にもチェックマークが勝手についたり、ずれたりする現象を解決したい

動作環境

  • Xcode9.2
  • Swift3

原因

どうやらセルの再利用に関する問題のようで、下記のようにテーブルにチェックマークをつける条件分岐を片方でしか行わなかった場合発生した。


import UIKit

class viewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

let alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

// ... 中略 ...

    /// セルの表示内容を操作するメソッド
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // ここでは事前に定義しておいたStoryboardのセルを指定
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellName", for: indexPath as IndexPath)
        cell.textLabel?.text = alphabet[indexPath.row]
        if cell.textLabel?.text == "a" {
           cell.accessoryType = .checkmark
        } 
        return cell
    }
}

解決策

チェックマークをつける際は条件分岐でつけない場合の処理もきちんと記載することで回避できた


import UIKit

class viewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

let alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

// ... 中略 ...

    /// セルの表示内容を操作するメソッド
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // ここでは事前に定義しておいたStoryboardのセルを指定
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellName", for: indexPath as IndexPath)
        cell.textLabel?.text = alphabet[indexPath.row]
        if cell.textLabel?.text == "a" {
           cell.accessoryType = .checkmark
        } else {
           cell.accessoryType = .none // 条件に当てはまらなかった場合、チェックマークをつけない記述を追記
        }
        return cell
    }
}

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.