UICollectionView stürzt zufällig, weil der Hervorhebung Problem
Ich habe eine UICollectionView
auf iOS7
die Abstürze zufällig beim intensiven scrollen. Ich konnte zombies und festgestellt, dass es gibt mir die Fehlermeldung:
*** -[NSIndexPath section]: message sent to deallocated instance 0x17dbc970
Ich glaube, dies ist aufgrund einer von Apple beschriebene Fehler hier. Scheinbar stürzt die app, wenn jemand highlights einer Zelle beim scrollen schnell, und dann das OS versucht unhighlight ist es, wenn es sich bewegt, Weg vom Schirm, wenn es aufhört zu existieren. Die vorgeschlagene Lösung ist das deaktivieren der userInteractionEnabled
- Eigenschaft der Zelle, und dann Bearbeiten Sie die Auswahl mithilfe UIGestureRecogniser
.
Hat sonst noch jemand mit gleichen Problem? Auch ich habe versucht, entfernen die userInteractionEnabled
Eigenschaft und mit einer Geste recogniser, aber das scheint nicht zu funktionieren. Irgendeine Idee, wie kann ich dieses Problem beheben?
BEARBEITEN: Code Hinzugefügt, auf Anfrage
-(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;
}
BEARBEITEN: mehr code..
Definierte ich die GalleryCell
für die Wiederverwendung wie folgt:
[self.flowCollection registerNib:[UINib nibWithNibName:@"Thumbs_Cell" bundle:nil] forCellWithReuseIdentifier:@"Gallery_Cell"];
Den GalleryCell Klasse Umsetzung:
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
}
- Sie laden Daten in Zellen von Core Data? Möglicherweise ist dieser Absturz passiert, wenn
cellForRowAtIndexPath:
arbeitet. - Ich bin mit SDWebImage Bilder laden, um die Zellen aus dem Internet.
- So sollten Sie kümmern sich darum, dass zu verwenden, da
UICollectionView
AnrufecellForRowAtIndexPath:
jedes mal, wenn die Zelle sichtbar wird. - Ok. Aber nicht diese haben zu tun mit der situation, wenn die Zelle unsichtbar wird, und wird freigegeben? Ich schaltete den userInteractionEnabled Eigenschaft, und der Absturz tritt nicht mehr auf. Das hat natürlich etwas zu tun mit den markierten Zustand der Zelle.
- Die log sagt, dass der code versucht, sendet eine Nachricht an aufgehoben - Instanz. Halten Sie im Verstand meine Bemerkung über
UICollectionView
- und check-out-Szenario. - Erste Sache, die wurde auf mein Kopf, dass
SDWebImage
versucht, um Bild zu versteckten Zelle. - Aber warum hat der Absturz tritt nicht ein, wenn ich userInteractionEnabled auf FALSE?
- Auch habe ich gerade kommentiert die SDWebImage code zu deaktivieren, das Bild laden und es nochmal versucht. Der Absturz immer noch Auftritt.
- Zeigen Sie Ihre
cellForRowAtIndexPath:
Umsetzung. - Code Hinzugefügt, wie gefordert. Bitte überprüfen Sie es heraus.
- Kann ich die definition der GalleryCell Klasse bitte?
- Hinzugefügt mehr code. Überprüfen Sie bitte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK. Ich glaube, ich habe es gelöst. Falls jemand Gesichter dieses problem, hier ist der fix:
Implementiert habe ich die folgende Methode in meiner
UICollectionViewDelegate
:Dadurch, dass jede Zelle aus-Hervorhebung, und daher verhindert, der Absturz, wenn das system versucht, unhighlight ist es, wenn es geht off-screen. Aber, wenn Sie dies tun, es hält auch den Aufruf der
didSelectItemAtIndexPath
Methode. So musste ich einenUITapGestureRecogniser
Methode zu implementieren, die Zell-Auswahl statt.Hoffe, das hilft.
shouldHighlightItem...
. zB.return [[collectionView indexPathsForVisibleItems] containsObject:indexPath];
. Ich werde es mal versuchen und hoffe, es klärt die Probleme meiner Kunden zu sehen sind.Ich würde vorschlagen, kehrte im folgenden: