dequeueReusableCellWithIdentifier不重复使用单元格

我有一个UICollectionView与自定义单元格的子类UICollectionViewCell 。 在代码中,我完成了以下操作:

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

这是我的cellForItem

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

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

编辑:

我添加了一个示例演示项目来说明问题,可以在此处找到xcode项目的链接。 当你到达底部时,它本质上是做一个无限的滚动,它只是附加更多的东西。 但是当你这样做的时候,它会再次调用init方法。


简而言之,你的代码工作正常。 正如所料,随着单元格从屏幕上滚动,它们最终被标记为可供重用。 当你调用dequeueReusableCellWithReuseIdentifier ,如果有一个单元可用于重用,它将这样做。 如果不是,它创建一个。

你会看到很多单元格被创建的时间是如果你快速滚动或连续滚动。 但是,如果你做了短小的卷轴,放手,暂停,让用户界面赶上并重复,然后你会看到很少的单元格被创建。

我认为这意味着iOS优先考虑用户界面和新单元的创建,而不是让旧单元出列,从而允许它们重用。 所以,如果你快速翻转,它会遇到麻烦,并将旧的单元格标记为可重用。 这可能并不是很糟糕,因为这可能是收集意见如此流畅的原因。 标记旧的单元格以供重用是iOS所要做的不太重要的事情之一。 但显然,如果记忆力很紧,这可能是一个问题。

顺便说一下,如果你也将NSLog放入dealloc ,你会注意到当UI在集合视图中快速滚动后终于赶上时,显然有一些逻辑表示“gee,我有更多的备用电池比我真正需要的要多,我要去除其中的一些。“ 实际上,这是一个相当聪明的实现。 关注速度,但是一旦UI下降,就会发生一些内存优化。


同意,我有同样的问题,但我想创建一个类别给我的可见细胞,如果可用的话。

// 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,使它成为FIREFirstResponder,但cellForRowAtIndexPath保持重新分配我的单元格,非常令人沮丧。


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

链接地址: http://www.djcxy.com/p/68649.html

上一篇: dequeueReusableCellWithIdentifier not reusing cells

下一篇: Calling python script with subprocess.Popen and flushing the data