2013-01-22 73 views
7

我有一個自定義單元格繼承UICollectionViewCell一個UICollectionView。而在代碼中,我做了以下:dequeueReusableCellWithIdentifier不重複使用細胞

[self.collectionView_ registerClass:[AHPinterestCell class] 
     forCellWithReuseIdentifier:@"AHPinterestCell"]; 

這就是那張在我cellForItem

AHPinterestCell *cell = 
       (AHPinterestCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"AHPinterestCell" 
                      forIndexPath:indexPath]; 

但是,似乎這不是重複使用的單元格。在每個屏幕我的集合視圖它顯示約9-10細胞,但是當我做無限滾動,然後我把它insertItemsAtIndexPath調用我的自定義單元格的initWithFrame方法,雖然它也許應該重用我已經有細胞。爲什麼是這樣?

編輯:

我加入這說明該問題的示例演示項目,鏈接到Xcode項目可以發現here。當你到達底部時,它本質上是做一個無限的滾動,它只是附加更多的東西。但是當你這樣做的時候,它會再次調用init方法。

+0

@Rob我在viewDidLoad中 – adit

+0

調用的registerClass @Sang它應該只是初始化像10,然後休息,當我向下滾動,它應該不會再因爲它重用的內容我已經有 – adit

+0

@Sang如何確保你它調用的init會在可見時啓動?所以在我的情況下,我有一個UICOllectionView,其中有100個單元格,但是一次顯示10個單元格。所以我假設只有10個init會被調用,剩下的將會被重用 – adit

回答

4

總之,你的代碼工作正常。正如所料,隨着單元格從屏幕上滾動,它們最終被標記爲可供重用。當你打電話給dequeueReusableCellWithReuseIdentifier時,如果有一個單元可供重用,它就會這樣做。如果不是,它創建一個。

,你會看到很多的細胞被創建的時間,如果你滾動快速或持續。但是,如果你做了短小的卷軸,放手,暫停,讓用戶界面趕上並重復,然後你會看到很少的單元格被創建。

我將此解釋爲意味着優先的iOS用戶界面和新的細胞在老細胞的離隊,讓他們重用的創建。所以,如果你快速翻轉,它會遇到麻煩,並將舊的單元格標記爲可重用。這可能並不是很糟糕,因爲這可能是收集意見如此流暢的原因。標記舊的單元格以供重用是iOS所要做的不太重要的事情之一。但顯然,如果記憶力很緊,這可能是一個問題。順便說一句,如果你把NSLog也放在dealloc中,你會注意到,當UI在集合視圖中快速滾動後終於趕上時,它顯然有一些邏輯表示「gee,我有更多的備用電池比我真正需要的多,我要去除其中的一些。「實際上,這是一個相當聰明的實現。關注速度,但是一旦UI下降,就會發生一些內存優化。

+0

Rob,非常棒的觀察..所以我如何製作它,以便在插入新項目時不會創建單元格?這導致我記憶力問題,因爲它激增。 – adit

+0

@adit我懷疑如果你使用'UICollectionView',你就會因內存利用率的內置UI優先級而停滯不前。如果你願意,你總是可以拋棄'UICollectionView',而是通過無限滾動來實現你自己的'UIScrollView'子類,在'scrollViewDidScroll'中,優先於在創建新單元格時釋放舊單元格。你只需要弄清楚你想在自己的'UIScrollView'中重新實現自己多少'UICollectionView'功能。 – Rob

0

同意,我也有同樣的問題,但我想創建一個類來給我可見的細胞,如果可用的。

// Header file UITableView+VisibleCell.h" 
@interface UITableView (VisibleCell) 
- (UITableViewCell*) visibleCellForRowAtIndexPath:(NSIndexPath *)indexPath; 
@end 


// Implementation file UITableView+VisibleCell.m 
#import "UITableView+VisibleCell.h" 

@implementation UITableView (VisibleCell) 

- (UITableViewCell*) visibleCellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    for(UITableViewCell* currentVisibleCell in self.visibleCells) 
    { 
     NSIndexPath* currentPath = [self indexPathForCell: currentVisibleCell ]; 
     if([currentPath isEqual:(id) indexPath]) 
     { 
      return currentVisibleCell; 
     } 
    }  
    return nil; 
}  
@end 

您也可以通過獲取可見單元格,然後返回,而不是零的cellForRowAtIndexPath,它的風格的問題開始。 (我需要這個來檢索給定單元格中給定標籤的UITextField,使其成爲FIRSTResponder,但cellForRowAtIndexPath保持重新分配我的單元格,非常令人沮喪。

+1

太好了,這也適用於UICollectionViewCell – zaheer

0

關閉您的設備設置的可訪問性 它的一個錯誤。 我在iPad mini上遇到了同樣的問題。

相關問題