Iphone dequeueReusableCellWithIdentifier不重用单元格
我有一个带有自定义单元格子类的Iphone dequeueReusableCellWithIdentifier不重用单元格,iphone,ios,objective-c,ipad,uicollectionview,Iphone,Ios,Objective C,Ipad,Uicollectionview,我有一个带有自定义单元格子类的UICollectionView。在代码中,我做了以下工作: [self.collectionView_ registerClass:[AHPinterestCell class] forCellWithReuseIdentifier:@"AHPinterestCell"]; 这就是我的cellForItem AHPinterestCell *cell = (AHPinterestCell *)[collect
UICollectionView
。在代码中,我做了以下工作:
[self.collectionView_ registerClass:[AHPinterestCell class]
forCellWithReuseIdentifier:@"AHPinterestCell"];
这就是我的cellForItem
AHPinterestCell *cell =
(AHPinterestCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"AHPinterestCell"
forIndexPath:indexPath];
然而,它似乎并没有重用这个单元。在我的每个屏幕的集合视图中,它显示了大约9-10个单元格,但是当我进行无限滚动,然后调用insertItemSatineXPath
时,它在我的自定义单元格上调用initWithFrame
方法,而它可能应该重用我已经拥有的单元格。为什么会这样
编辑:
我正在添加一个示例演示项目来说明这个问题,可以找到xcode项目的链接。它本质上是一个无限的滚动,当你到达底部时,它只是在其中添加了更多的内容。但当您这样做时,它将再次调用init方法。简而言之,您的代码工作正常。正如所料,当单元格从屏幕上滚动时,它们最终会被标记为可供重用。当您调用
dequeueReusableCellWithReuseIdentifier
时,如果有一个单元格可供重用,它就会这样做。如果不是,它会创建一个
如果快速或连续滚动,您将看到大量单元格被创建。但是如果你做了一些小的滚动,放开,暂停,让UI跟上并重复,那么你会看到很少的单元格被创建
我认为这意味着iOS将UI和新单元的创建置于旧单元的排队之上,从而允许它们的重用。因此,如果您快速翻转,它很难捕捉到旧单元并将其标记为可供重用。这可能并不完全是坏事,因为这可能是使集合视图的流程如此顺畅的原因。标记旧单元以供重用是iOS在这里要做的不太重要的事情之一。但很明显,如果内存紧张,这可能是一个问题
顺便说一句,如果你在
dealloc
中也放一个NSLog
,你会注意到,当用户界面在集合视图中快速滚动后终于赶上时,它显然有一些逻辑说“哎呀,我有了比我真正需要的更多的备用单元格,我要去掉其中的一些。”实际上,这是一个相当聪明的实现。关注速度,但在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
您也可以从获取可见单元格开始,然后返回cellforrowatinexpath而不是nil,这是一个风格问题。(我需要它来检索给定单元格中带有给定标记的UITextField,使其成为第一响应者,但CellForRowatineXpath一直在重新分配我的单元格,这非常令人沮丧。关闭设备设置的可访问性。 这是一只虫子。
我的iPad mini上也有同样的问题。@Rob我打电话给registerClassviewDidLoad@Sang它应该像10一样初始化,然后当我向下滚动时,它不应该再调用init,因为它重用了我已经使用过的东西have@Sang你有多确定当它变得可见时它会初始化?所以在我的例子中,我有一个UICOllectionView它包含100个单元格,但每次屏幕上显示10个。所以我假设只调用10个init,其余的将被调用reuse@Rob我没有为此使用xib或故事板,没有IBOutlet。我正在对UICollectionViewCell进行子类化,然后在view Dod load中调用registerClass。@Rob因此,当我调用insertItemsAtIndexPath时,已经有一些c屏幕上滚动的ELL,有很多可以重复使用。我最初认为InsertItemSatineXPath总是会创建新的单元格。但我想根据你的解释,这不是caseRob,很好的观察。那么我如何使它在插入新项目时不会创建单元格呢?这导致了我的内存问题因为它会增加。@adit我怀疑如果你使用
UICollectionView
,你会被内置的UI优先于内存利用率的优先级所困扰。如果你想,你可以随时抛弃UICollectionView
,而是在uicrollview
子类e> scrollViewDidScroll,将旧单元格的释放优先于新单元格的创建。您只需计算出您希望在自己的UIScrollView
中重新实现多少UICollectionView
功能即可。