由于突出显示问题,UICollectionView随机崩溃

时间:2013-12-08 12:18:05

标签: objective-c ios7 uicollectionview uigesturerecognizer uicollectionviewcell

我在UICollectionView上有一个iOS7,在强烈滚动时会随机崩溃。我启用了僵尸,发现它给我一个错误说:

*** -[NSIndexPath section]: message sent to deallocated instance 0x17dbc970

我认为这是由于描述了here的Apple错误。显然,当有人在快速滚动时突出显示一个单元格时,应用程序会崩溃,然后当操作系统离开屏幕时,当它不再存在时,操作系统会尝试取消它。建议的解决方案是禁用单元格的userInteractionEnabled属性,然后使用UIGestureRecogniser处理选择。

还有其他人遇到同样的问题吗?此外,我尝试取消设置userInteractionEnabled属性并使用手势识别器,但这似乎不起作用。知道如何解决这个问题吗?

编辑:根据要求添加了代码

-(UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

NSString *CellIdentifier = @"Gallery_Cell";

GalleryCell *cell= (GalleryCell *)[self.flowCollection dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

if (indexPath.row < self.collectionData.count) {

    CellDetails *dets = [self.collectionData objectAtIndex:indexPath.row];

    NSURL *mainImageURL = [NSURL URLWithString:dets.imageURL];

    cell.image.contentMode = UIViewContentModeScaleAspectFill;
    cell.image.clipsToBounds = YES;

    if ([[[SDWebImageManager sharedManager] imageCache] imageFromDiskCacheForKey:[self cacheKeyForURL:mainImageURL]] == nil) {

          [cell.image setImageWithURL:mainImageURL placeholderImage:nil];

    }else{

          [cell.image setImage:[[[SDWebImageManager sharedManager] imageCache] imageFromDiskCacheForKey:[self cacheKeyForURL:mainImageURL]]];

    }
}

return cell;
}

编辑:更多代码..

我将GalleryCell定义为重用,如下所示:

[self.flowCollection registerNib:[UINib nibWithNibName:@"Thumbs_Cell" bundle:nil] forCellWithReuseIdentifier:@"Gallery_Cell"];

GalleryCell类的实现是:

GalleryCell.h

@interface GalleryCell : UICollectionViewCell

@property (nonatomic, retain) IBOutlet UIImageView *image;

@end

GalleryCell.m

@implementation GalleryCell
@synthesize image;

-(void) setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];
    [self setNeedsDisplay];
}

-(void)prepareForReuse {
    [super prepareForReuse];
    [self.image cancelCurrentImageLoad]; // SDWebImage method to cancel ongoing image load
}

2 个答案:

答案 0 :(得分:9)

行。我好像已经解决了。如果有人遇到这个问题,这里有修复:

我在UICollectionViewDelegate中实施了以下方法:

-(BOOL) collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath{

    return NO;
}

这可以防止任何单元格突出显示,因此,当系统在屏幕外时尝试取消突出显示时,可以避免崩溃。但是,当你这样做时,它也停止调用didSelectItemAtIndexPath方法。所以我不得不使用UITapGestureRecogniser方法来实现单元格选择。

希望这有帮助。

答案 1 :(得分:1)

我建议退回以下内容:

- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath{

        return !collectionView.dragging && !collectionView.tracking;
}