7

我有UICollectionView一个自定义单元格子类化UICollectionViewCell。在代码中我做了以下事情:

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

这就是我的cellForItem

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

但是,它似乎没有重复使用该单元格。在我的每个屏幕的集合视图中,它显示了大约 9-10 个单元格,但是当我进行无限滚动然后我调用insertItemsAtIndexPath它时,它会调用initWithFrame我的自定义单元格上的方法,而它可能应该重用我已经拥有的单元格。为什么是这样?

编辑:

我正在添加一个示例演示项目来说明问题,可以在此处找到 xcode 项目的链接。当您到达底部时,它实际上是在进行无限滚动,它只是在其中添加了更多内容。但是当你这样做时,它会再次调用 init 方法。

4

3 回答 3

4

简而言之,您的代码工作正常。正如预期的那样,当单元格从屏幕上滚出时,它们最终会被标记为可重复使用。当您调用 时dequeueReusableCellWithReuseIdentifier,如果有一个单元格可供重用,它就会这样做。如果没有,它会创建一个。

如果您快速或连续滚动,您会看到创建大量单元格的时间。但是如果你做短小的滚动,放开,暂停,让 UI 跟上并重复,那么你会看到创建的单元格非常少。

我将此解释为意味着 iOS 优先考虑 UI 和新单元格的创建,而不是旧单元格的出列,从而允许它们重用。因此,如果您快速翻转,它很难赶上旧单元并将其标记为可重复使用。这可能并不完全是坏事,因为这可能是集合视图如此流畅的原因。标记旧单元以供重用是 iOS 在这里要做的不太重要的事情之一。但很明显,如果内存很紧,这可能是个问题。

顺便说一句,如果你也放一个NSLogin dealloc,你会注意到,当 UI 在集合视图中快速滚动后终于赶上时,它显然有一些逻辑在说“哎呀,我还有更多的空闲比我真正需要的细胞,我要摆脱其中的一些。” 实际上,这是一个非常聪明的实现。专注于速度,但一旦 UI 安静下来,就会进行一些内存优化。

于 2013-01-22T18:13:50.330 回答
0

从您的设备设置中关闭辅助功能。它是一个错误。我的 iPad mini 也遇到了同样的问题。

于 2014-06-03T14:47:35.550 回答
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 而不是 nil,这是样式问题。(我需要它来检索给定单元格中具有给定标签的 UITextField 以使其成为FIrstResponder,但 cellForRowAtIndexPath 不断重新分配我的单元格,非常令人沮丧。

于 2013-04-17T14:44:47.493 回答