Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone dequeueReusableCellWithIdentifier不重用单元格_Iphone_Ios_Objective C_Ipad_Uicollectionview - Fatal编程技术网

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
功能即可。