2017-05-17 3 views
0

私はtableViewに2つのセクションを持ち、multipleSelectionをtrueにしています。 セクション1で1番目のセルを選択してからスクロールダウンすると、2番目のセクションの1番目のセルがすでに選択されていて、ランダムなスクロールがいくつかシャッフルされています。TableView AccessoryTypeチェックマークシャッフル

また、私はcheckmark

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark 
    } 
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { 
     tableView.cellForRow(at: indexPath)?.accessoryType = .none 
} 

答えて

1

をマークするcellForRowAtで書かれた任意のコードを持っていない私はあなたがのは、最初に、あなたのテーブルビューで10個の可視セルを持っているとしましょうcellForRow(at:) であなたのセルを取得するためにdequeueReusableCell(withIdentifier:)を使用することを前提としています。今すぐスクロールし、cellForRow(at:)が次のセルに呼び出されると、新しいセルが(リサイクルプールが空であるため)作成され、TableViewの下部に追加されます。一番上のセルが画面から消えると、すぐにリサイクルプールに追加されます。さらにスクロールがわかっている場合は、cellForRow(at:)が呼び出され、の側に呼び出されます。しかし、新しいセルを作成する代わりに、次のセルがリサイクルプールから取り出され、このセルが下部に追加されます。 プロパティの値を変更しないと、値がリサイクルプールに追加される前に保持されます。 あなたのUITableViewCellサブクラスのprepareForReuse()にデフォルト値にセルをリセットするか、チェックしてcellForRow(at:)

0

のすべての値を設定する必要がありますどちらかあなたは一例 var isSelect: Bool = falseのための新しい変数を追加し、新しいUITableViewCellクラスを試すことができます。 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCellの判定isSelectの値は対応する表示処理を行うことができます。tableViewを選択したときに、このセルのisSelectreloadData()を変更します。申し訳ありませんが、私の英語は良くありませんが、表現がはっきりしないことがあります。

0

セルはtableviewによって再利用されます。アレイモデルまたは辞書モデルを使用して、選択したステータスをマークする必要があります。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     selectedArray[indexPath.row] = true 
     tableView.reload() 
} 

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { 
     selectedArray[indexPath.row] = false 
     tableView.reload() 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    //init cell 
    let selected = selectedArray[indexPath.row] 
    cell.accessoryType = selected ? .checkmark : .none 
} 
+0

@simalome選択/選択解除ごとにtableViewをリロードする正しい方法はありますか? – Nitesh

+0

それは単純です:)。代わりに 'tableView.reloadRows(at:[indexpath]、with:.none)'を使うことができます。 – simalone

関連する問題