2017-02-10 11 views
4

私は非常に厄介な問題があります。複数のセルをマークするテーブルビューSwift 3

多かれ少なかれ50個のセルを持つtableViewがあり、私が望むものを選択できるオプションがいくつか表示されています。 Appleのドキュメントでは、デフォルトでは、セルが表示されていないときに再利用されています。これにより、最初のセルを選択すると、6つのセル1がマークされます。つまり、最初の6つのセルを選択すると、テーブルのすべてのセルがマークされます。

マイテーブルビューでは複数の選択が可能です。選択は次のように行われます:

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

どうすれば解決できますか?サブクラスのprepareForReuse()があることはわかっていますが、それは解決策ですか?もしそうなら、私はあなたがそれをやる方法の例を教えてもらえますか?

+0

はあなたには、いくつかのより多くのコードを表示することができます

3.implementをcell.buttonするタグ値を割り当てます。?? –

+1

1つのMutablearrayを取ることができます。ユーザーが1つのセルをクリックすると、そのセルのindexpathをその配列に格納し、同じセルが再び選択された場合は配列内のindexpathをチェックし、配列からindexpathを削除するか、indexpathを配列に追加します。 –

+0

@Jecky Modi最高のソリューション。 –

答えて

3

は、それはあなた

var arr_selectedindePath = NSMutableArray() 
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    { 
     if arr_selectedindePath .contains(indexPath) { 

      arr_selectedindePath .remove(indexPath) 
      tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none 
     } 
     else 
     { 
      arr_selectedindePath .add(indexPath) 
      tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark 
     } 

    } 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 

     let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell")! 
     if arr_selectedindePath .contains(indexPath) { 
      cell.accessoryType = .checkmark 
     } 
     else 
     { 
      cell.accessoryType = .none 
     } 

    } 
+0

あなたの例は完璧に働いていました。どうもありがとうございました! –

+0

@RodrigoFuscaldi welcome :) –

3

cellForRowAtIndexPathが呼び出されたときに更新された内容のセルが表示されるように、データモデルを更新する必要があります。

データモデルを使用しない場合は、indexPathを変更可能な配列に格納し、現在のindexPathがマークされているかどうかを確認する必要があります。

これが役に立ちます。ここ

-1

カスタムセルで

助けるかもしれないコードです。

protocol CellDelegate { 

    func didTapOnButton(_ cell:Cell) 

} 

デリゲートを作成します。 宣言デリゲート

var delegate:CellDelegate? 

3.Overrideこの方法で、あなたのテーブルビューコントローラで

override func prepareForReuse() { 
     super.prepareForReuse() 
     self.delegate = nil 
    } 


@IBAction func buttonTapped() 
{ 
    self.delegate!.didTapOnButton(self) 
} 

1.Implementのデリゲートメソッド

2.Inside cellForRowAtIndexPathこの方法

func didTapOnButton(_ cell: Cell) { 
       print("off button clicked at index \(cell.button.tag)") 

      } 
関連する問題