预先填充UICollectionView单元重用队列

问题

我有一个应用程序与一个单一的UICollectionView ,这是第一次口吃,我滚动它。 我已经把源代码缩小到新的单元格(2)正在被创build的事实(使用initWithFrame:因为没有单元格躺在被重用。 在第一次滚动之后,重用队列不是空的,单元格可以重复使用,不会出现口吃。

黑客

所以我已经能够在iOS运行时头文件中的私有方法的帮助下解决这个问题:

 - (void)_reuseCell:(id)arg1; 

我的假设是,这是细胞被添加到重用队列中的地方。 使用这个未logging的方法的黑客看起来像这样:

 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审查。 有没有办法做到这一点,而不使用无证方法? 如果没有,是我唯一的手段只是混淆黑客?

有没有办法做到这一点,而不使用无证方法?

如果问题只是需要很长时间来创build单元格,那么您可以简单地创build一些附加function,并将其保留在视图控制器中,直到收集请求为止。 已经在代码中预先分配了一些单元格,调用dequeueReusableCellWithReuseIdentifier:获取集合为您创build它们。 将它们保存在视图控制器的数组中。 接下来,在你的...cellForItemAtIndexPath:方法中,如果数组不是空的,则从数组中删除一个单元格,并使用它而不是要求集合视图为可重用的单元格。

这应该通过移动创build单元格的位置而不使用任何未公开的方法来解决您的问题。

另一种方法是加快细胞的创build过程,这样你就不必打扰预先分配的细胞。 分析您的代码,了解您的细胞为何需要花费这么长的时间来构build 也许你可以通过消除不必要的视图来简化你的单元结构