2015-11-04 48 views
3

我有一個CollectionView,我使用單元格來顯示視頻,並且我還在變量上存儲了一些其他數據。每當我滾動我重複使用下面的代碼之前碎片:UICollectionViewCells deque返回錯誤的單元格

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("profileCell", forIndexPath: indexPath) as! ProfileCollectionViewCell 

但我注意到,當我使用我先前使用過的indexPath,我沒有得到相同的細胞如以前,但另一個細胞顯然在隨機順序。我想避免在沒有必要時重新加載視頻。

有沒有辦法讓我用相同的indexPath使用同一個單元?

感謝, 卡洛斯

+1

可能重複的[UICollectionView - 圖像隨機設置](http://stackoverflow.com/questions/23013935/uicollectionview-image-is-getting-set-randomly) – casillas

回答

0

這就是collectionView.dequeueReusableCellWithReuseIdentifier的工作原理。 如果你想繞過這個功能,你可以保存在一個數組中創建的所有單元格,然後取代已經加載的視頻而不是離隊。但是,如果您使用某些框架來加載視頻後緩存視頻,則根本不需要處理該視頻。

var cells: [CustomCollectionViewCell] = [] 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     var cell:CustomCollectionViewCell? 
     if cells.count >= indexPath.row { 
      cell = cells[indexPath.row] 
     } else { 
      cell = CustomCollectionViewCell() 
      //setup cell 
      cells.append(cell) 
     } 

     return cell! 
    } 

免責聲明:

該解決方案是一個黑客。正如下面評論中的@Async所提到的,如果您創建大量單元格,此解決方案將使用大量內存。

+0

嚴重,這是非常煩人的,而雖然deque應該是卸載內存使用的,我們不得不在加載數組的時候加載它,並且當你的表一直在更新時會出現額外的問題,可能會減少單元的數量(所以這個例子不起作用) –

+0

這很大程度上取決於您計劃在表格視圖中加載多少行。代碼將工作,但正如你提到它將使用更多的內存。它也可能會減慢第一卷的速度。但這一切都取決於你如何以及在哪裏使用它。在列表中有10-20個視頻的屏幕中,我嚴重懷疑您會遇到問題。如果我們正在說100行,那麼可能... – Moriya

+0

在我的情況是稍有不同:我需要加載許多單元格(大約70-100),並根據條件突出顯示某些單元格,但使用出列單元時突出顯示錯誤始終..我真的很生氣)) –

0

您正在使用可重複使用的細胞。因此,你不能確定你總是擁有同一個單元,但它幾乎總是相反的。您可以嘗試在第一次加載時存儲單元格,然後在cellForRow中檢查它,但在我看來,更好的方法是將視頻存儲到文件中(當然有限制),因爲存儲單元格不是最佳選擇。

0

你不能影響你從dequeueReusableCellWithReuseIdentifier得到的單元實例。因此,當單元格在屏幕外滾動時,您無法將視頻保留在單元格中。

你可以做的是添加一個NSMutableDictionary屬性到你的視圖控制器並存儲對它的視頻的引用(使用單元格的indexPath作爲鍵)。您可以將參考文獻存儲在 tableView(_:didEndDisplayingCell:forRowAtIndexPath:)中。

然後,當您從dequeueReusableCellWithReuseIdentifier獲取單元格時,您可以從字典中檢索視頻並將其添加到單元格中。這樣,從隊列中取回哪個單元格並不重要。

相關問題