2017-06-19 31 views
1

私は自分のtableViewCellの中にimageViewを持っており、その画像を選択時に変更したいと思います。これは私がそれを持っているコードされていますUITableViewCell(swift 3 xcode)で選択した画像を変更する

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let myCell = tableView.cellForRow(at: indexPath) as! TableCell 
    myCell.resourceIcons.image = UIImage(named: "RubiusResources2") 
    tableView.deselectRow(at: indexPath, animated: true) 

} 

コードは動作しますが、さらにダウンのtableView異なるセクション内の他の行の一部が変更に思えます。

EDIT:

私が最初に私のテーブルが持っていたセクションと行の量に2Dブール値の配列を作成し、falseにそれらすべてを設定します。

コメントを使用して、私は次のソリューションに来て怒鳴ります。

var resourceBool = Array(repeating: Array(repeating:false, count:4), count:12) 

次にif文を作成して、indexPathの配列が偽か真であるかどうかを確認しました。これは、画像の状態が変わるところです。

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

    let myCell = tableView.dequeueReusableCell(withIdentifier: "cellId", for: indexPath) as! TableCell 

    if (global.resourceBool[indexPath.section][indexPath.row] == false) { 
     myCell.resourceIcons.image = global.systemResourceImages[0] 
    } else if (global.resourceBool[indexPath.section][indexPath.row] == true) { 
     myCell.resourceIcons.image = global.systemResourceImages[1] 
    } 

    return myCell 
} 

次に、didSelectRow関数で、indexPathの配列をtrueに変更し、tableViewデータをリロードします。

私の理解では、オブジェクトの状態は常にcellForRow内になければなりません。

+0

ここに私のコメントを参照してください。https://stackoverflow.com/questions/44618366/swift-uicollectionview-cells-arent-滞在中の#comment76222954_44618366テーブルビューの場合と同じことです。セルは再利用され、セルは状態を保持してはいけません。イメージの変更は状態です。 – luk2302

+1

セルの再利用があります。セルからprepareForReuseに常に元の背景を設定する必要があります。基本的にprepareForReuseでは、セルからすべてのプロパティを元の状態に設定する必要があります。 – teixeiras

+0

@ luk2302は正しい解決策ですが、問題の解決策がもう1つあります。すべてのセルの選択状態に同じイメージを使用し、そのイメージをimageViewの強調表示された状態にして、選択した行のみの状態を変更する。 イメージのプロパティで通常のイメージを使用します。 –

答えて

2

解決策の1つは、選択した行のリストを個別に維持し、cellForRowAtメソッドで比較することです。

コードは次のようになります。

var selectedArray : [IndexPath] = [IndexPath]() 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let myCell = tableView.cellForRow(at: indexPath) as! TableCell 
    myCell.resourceIcons.image = UIImage(named: "RubiusResources2") 
    tableView.deselectRow(at: indexPath, animated: true) 

    if(!selectedArray.contains(indexPath)) 
    { 
     selectedArray.append(indexPath) 
    } 
    else 
    { 
     // remove from array here if required 
    } 
} 

、その後cellForRowAtに、設定するには、このコードを記述する適切な画像

​​
関連する問題