2017-07-25 15 views
-1

したがって、各セルにアイテムのリストを持つテーブルビューがあります。これらのセルの各々は、タップされると、セルを拡大し、そのアイテムの画像を表示する画像ビューを含む。私がテーブルビューを下にスクロールし、選択されたセルまでスクロールバックすると、イメージはなくなります。私はこれが細胞の再利用によるものだと知っていますが、他のアイテムをスクロールしながら展開された細胞イメージを保持する方法はわかりません。選択したセルが再利用されないようにします。

私が来ている最も近いがここにある: my table view reuse the selected cells when scroll -- in SWIFT

誰かが私に素晴らしいだろう手を貸すことができれば。ありがとう!

編集:コードスニペットを追加 - お待ちください。

fileprivate var expandedRowIndex: Int? 

// cellForRowAt 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    // CatalogItem row. 
    let item = self.items[indexPath.row] 
    let expanded = indexPath.row == self.expandedItemRowIndex 

    // Return standard catalog item cell. 
    let reuseID = expanded 
       ? CatalogItemCell.PROTOCELL_EXPANDED.id 
       : CatalogItemCell.PROTOCELL.id 
    let cell = tableView.dequeueReusableCell(withIdentifier: reuseID) as! CatalogItemCell 

    // Reset thumbnail image back to nil. Needed so that images appear 
    // only in the cell that they belong in. 
    if indexPath.row == self.expandedRowIndex{ 
     cell.uiImage_Thumbnail.image = nil 
    }  
    return cell 
} 

// didSelectRowAt 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{ 
    tableView.deselectRow(at: indexPath as IndexPath, animated: true) 

    // Expand row - Get the current cell and show image 
    self.expandedItemRowIndex = indexPath.row 
    let item = self.items[indexPath.row] 
    let currentCell = tableView.cellForRow(at: indexPath) 

    // Pass both the selected cell and item to the ImageManager 
    ImageManager.startImageRequest(currentCell: currentCell!, item: item) 

    if self.expandedRowIndex == indexPath.row 
    { 
     // Selected row is already expanded. 
     return 
    } 

    var reloadPaths = [IndexPath]() 

    // Collapse previously expanded row. 
    if let previousRowIndex = self.expandedRowIndex 
    { 
     reloadPaths.append(IndexPath(row: previousRowIndex, section: 0)) 
    } 

    // Expand the selected row. 
    self.expandedRowIndex = indexPath.row 
    let item = self.items[indexPath.row] 
    debugPrint(item.description) 
    reloadPaths.append(IndexPath(row: indexPath.row, section: 0)) 
    tableView.reloadRows(at: reloadPaths as [IndexPath], with: .fade) 

} 
+0

cellForRowAtIndexPathメソッドのコードを追加できますか? – Delimiter

+1

「選択されたセルを再利用しないようにする」:再利用とその後ろに行われるすべての最適化を保つ必要はありません。再利用の仕組みを理解し、コードをそれに適応させることが必要ですか?いくつかのコードと例で私たちはあなたを助けてくれるかもしれませんが、他にはできません。 – Larme

+0

私の質問をいくつかのスニペットで更新しました。うまくいけば、正しい軌道に乗ってくれれば十分です。 @Larmeはい、私はiOSの世界で私の知識の欠如のために間違った質問を語ったと思います。私は、セルを拡大したままにして、そのセルからスクロールしても画像を表示し続けたいと思います。 – Mystified

答えて

3

selectedIndex変数を更新することができます。 cellForRowで、この呼び出しがselectedCellかどうかを確認します。はいの場合は、選択したセルに必要なカスタマイズを行います。

また、heightForRowを処理する場合は、選択したセルの呼び出しであるかどうかもチェックします。

選択したセルのindexPathをメンテナンスすることができます。複数のセクションがある場合。 再利用を防ぐ必要はありません。

希望に役立ちます。

+0

私が取り組んでいたコードにはこのような変数がありました。しかし、私はついにそれがどこにも設定されていないことに気づいた。私がそれを設定すると、すべてがうまくいった... Doh! ありがとう! – Mystified

関連する問題