2014-02-19 15 views
6

的問題預先填入了UICollectionView小區重用隊列

我有一個應用程序與單個UICollectionView其的口吃第一次我滾動它。我已經將源代碼縮小到新單元(2)正在創建(使用initWithFrame:)這一事實,因爲沒有任何單元可以重複使用。在最初的滾動之後,重用隊列不是空的,單元格可以重用並且不會出現口吃。

的哈克

所以我已經能夠用一個私有方法的幫助,要解決這個問題的iOS runtime headers

- (void)_reuseCell:(id)arg1; 

我的假設是,這是被添加在那裏細胞回到重用隊列中。使用這種無證方法的黑客看起來像這樣:

int prefillCellCount = 10; 
NSMutableArray *cells = [[NSMutableArray alloc] initWithCapacity:prefillCellCount]; 
for (int i=0; i<10prefillCellCount i++) { 
    UICollectionViewCell *cell = [self.gridView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; 
    [cells addObject:cell]; 
} 
for (UICollectionViewCell *cell in cells) { 
    [self.gridView _reuseCell:cell]; 
} 

黑客工程!滾動時沒有口吃。

問題

我不認爲我將能夠得到過去在App Store評審與這個技巧。有沒有辦法做到這一點,而不使用無證方法?如果沒有,是我唯一的手段只是混淆黑客?

回答

4

有沒有辦法做到這一點,而不使用無證方法?

如果問題僅僅是需要很長時間才能創建單元格,那麼您可以簡單地創建一些額外功能並將它們保留在視圖控制器中,直到集合請求它們爲止。您已經在代碼中預先分配了幾個單元格,請致電dequeueReusableCellWithReuseIdentifier:以獲取該集合以爲您創建它們。將它們保存在視圖控制器的數組中。接下來,在你的...cellForItemAtIndexPath:方法中,如果數組不是空的,則從數組中刪除一個單元格並使用它來代替向集合視圖詢問可重用單元。

這應該通過移動創建單元格的位置來解決您的問題,而不使用任何未公開的方法。

另一種方法是加速細胞的創建過程,這樣就不必打擾預先分配細胞。剖析您的代碼,瞭解您的細胞爲何需要這麼長時間來構建。也許你可以通過刪除不必要的視圖來簡化你的單元結構

+0

謝謝,這個解決方案效果很好。只要確保預先分配的單元格與正在顯示的單元格具有相同的索引路徑。 –

+0

@ scompt.com是否仍然適合你們?當我在iPad 3上嘗試使用這個視圖時,我得到的視圖在整個地方都消失了(這確實存在已知的出列方法問題:http://stackoverflow.com/questions/19276509/uicollectionview-do-not-reuse-cells) 。 – arsenius