首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预填充UICollectionView信元重用队列

预填充UICollectionView信元重用队列
EN

Stack Overflow用户
提问于 2014-02-19 10:34:42
回答 1查看 1.4K关注 0票数 6

问题

我有一个只有一个UICollectionView的应用程序,我第一次滚动它的时候就口吃了。我缩小了源的范围,因为创建了新的单元格(2) (使用initWithFrame:),因为周围没有可以重用的单元格。在该初始滚动之后,重用队列不为空,单元格可以重用,也不会结结巴巴。

The Hack

所以我已经能够用iOS runtime headers中的私有方法来解决这个问题

代码语言:javascript
复制
- (void)_reuseCell:(id)arg1;

我的假设是,这就是将单元重新添加到重用队列中的地方。使用此无文档方法的黑客如下所示:

代码语言:javascript
复制
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的评论通过这次黑客攻击。有没有办法做到这一点,而不使用无文档化的方法?如果不是的话,我唯一的办法就是混淆黑客的存在吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-19 10:50:44

有没有办法做到这一点,而不使用无文档化的方法?

如果问题仅仅是创建单元格需要很长时间,那么您可以简单地创建一些额外的部分,并将它们保存在视图控制器中,直到集合请求它们为止。正如在代码中所做的那样,预先分配几个单元格,调用dequeueReusableCellWithReuseIdentifier:来获取集合,以便为您创建它们。将它们保存在视图控制器中的数组中。接下来,在...cellForItemAtIndexPath:方法中,如果数组不是空的,则从数组中删除一个单元格并使用它,而不是向集合视图请求一个可重用的单元格。

这应该通过移动创建单元格的点来解决您的问题,而不需要使用任何无文档的方法。

另一种方法是加快单元格的创建过程,这样就不必费心预先分配单元格了。分析您的代码,以了解为什么您的单元格要花这么长时间来构建。也许您可以通过删除不必要的视图来简化您的单元格结构?

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21877873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档