我在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
}
答案 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;
}