Assertionsfehler in -[UICollectionViewData numberOfItemsBeforeSection:]
Mit IOS 6 und dem neuen UICollectionView
Ich habe 2 UICollectionViews auf dem UIViewController und mit einem Storyboard
Ich bekomme folgende Fehlermeldung, wenn ich klicken, um die UICollectionView
Ich bin mir nicht sicher, warum dies geschieht und Google liefert 0 Ergebnisse für diesen Fehler...
2012-10-13 20:30:06.421 MyApp[768:907] Assertion Fehler in[UICollectionViewData numberOfItemsBeforeSection:], /SourceCache/UIKit/UIKit-2372/UICollectionViewData.m:415
2012-10-13 20:30:06.427 MyApp[768:907] Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'die Anforderung für die Anzahl der Elemente vor dem Abschnitt 2147483647, wenn es nur 1-Abschnitte in der Ansicht Sammlung'
Ich bin nicht mit Sektionen an allen und habe es nur 1 Abschnitt:
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}
Es passiert (erscheint zufällig) wenn ich auf auf UICollectionView Bereich habe ich ein Stück code zu entfernen element aus der UICollectionView:
[tilesArray removeObjectAtIndex:indexPath.row];
[self.tilesCollectionView reloadData];
[resultsArray addObject:str];
[self.resultsCollectionView reloadData];
Hier ist, wie die arrays angeschlossen an die UICollectionViews
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
if(collectionView.tag == 2)
return [resultsArray count];
else
return [tilesArray count];
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
if(collectionView.tag == 2)
{
static NSString *cellIdentifier = @"ResultCell";
ResultCell *cell = (ResultCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
cell.mainImage.image = [UIImage imageNamed:currentArtContainer.tileMainImage];
NSString *cellData = [resultsArray objectAtIndex:indexPath.row];
[cell.titleLabel setText:cellData];
return cell;
}
else
{
static NSString *cellIdentifier = @"TileCell";
TileCell *cell = (TileCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
cell.topImage.image = [UIImage imageNamed:currentArtContainer.tileTopImage];
cell.mainImage.image = [UIImage imageNamed:currentArtContainer.tileMainImage];
NSString *cellData = [tilesArray objectAtIndex:indexPath.row];
[cell.titleLabel setText:cellData];
return cell;
}
}
Bitte helfen Sie mir dieses Problem zu beheben. Nicht einmal sicher, wie kann ich fangen die Ausnahme, da kommt es aus der UICollectionView internen code.
Auch vergaß zu erwähnen, ich bin mit einem benutzerdefinierten layout für die UICollectionView, aber ich weiß nicht, ob es im Zusammenhang mit diesem Problem.
Danke nochmal für Eure Hilfe Jungs!
Bearbeiten:
Ich bin immer die Ausnahme, nachdem alle layout-Methoden aufgerufen werden...
Hier ist meine custom layout...
Ich bin noch nicht sicher, wie es zu lösen ist, da alle meiner try-catch-Blöcke nicht den Fehler abfangen...
- (void)prepareLayout
{
NSLog(@"In prepareLayout.");
[super prepareLayout];
_cellCount = [[self collectionView] numberOfItemsInSection:0];
}
- (CGSize)collectionViewContentSize
{
NSLog(@"In collectionViewContentSize.");
@try {
CGSize csize = [self collectionView].frame.size;
NSLog(@"In here.");
return csize;
}
@catch(NSException *exception)
{
NSLog(@"collectionViewContentSize %@: %@",[exception name],[exception reason]);
}
}
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
@try {
NSLog(@"In layoutAttributesForItemAtIndexPath. item %d", indexPath.row);
UICollectionViewLayoutAttributes* attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
attributes.size = CGSizeMake(ITEM_SIZE, ITEM_SIZE);
NSLog(@"firstRun %d", self.firstRun);
//NSLog(@"panStatus %@", self.panStatus);
if (self.firstRun == 0) {
CGFloat x = 0, y = 0;
CGFloat boundx = self.collectionView.frame.size.width * 0.70; //Use the whole canvas
CGFloat boundy = self.collectionView.frame.size.height * 0.70; //Use the whole canvas
while (x < 50 || x > boundx) x = arc4random() % (int)boundx + indexPath.item;
while (y < 50 || y > boundy) y = arc4random() % (int)boundy + indexPath.item;
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
if (self.positions)
dictionary = [self.positions mutableCopy];
[dictionary setObject:[NSValue valueWithCGPoint:CGPointMake(x, y)] forKey:@(indexPath.item)];
if (!self.positions)
self.positions = [[NSDictionary alloc] init];
self.positions = dictionary;
attributes.center = CGPointMake(x, y);
} else if (self.firstRun > 0) {
CGPoint point = [[self.positions objectForKey:@(indexPath.item)] CGPointValue];
attributes.center = CGPointMake(point.x, point.y);
}
NSLog(@"END layoutAttributesForItemAtIndexPath. item %d", indexPath.row);
return attributes;
}
@catch(NSException *exception)
{
NSLog(@"layoutAttributesForItemAtIndexPath %@: %@",[exception name],[exception reason]);
}
}
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
@try {
NSLog(@"layoutAttributesForElementsInRect ...");
NSMutableArray* attributes = [NSMutableArray array];
for (NSInteger i=0 ; i < self.cellCount; i++) {
NSIndexPath* indexPath = [NSIndexPath indexPathForItem:i inSection:1];
[attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]];
}
NSLog(@"END layoutAttributesForElementsInRect ...");
return attributes;
}
@catch(NSException *exception)
{
NSLog(@"layoutAttributesForElementsInRect %@: %@",[exception name],[exception reason]);
}
}
InformationsquelleAutor der Frage Josh Katz | 2012-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte ich das geschehen beim ausführen reloadData von einer gestik-Erkennung, Einstellung delaysTouchesBegan auf die gestik-Erkennung geholfen.
InformationsquelleAutor der Antwort Keke
Der Schlüssel hier ist, diese Nummer von Ihrem Fehler:
Dies ist der numerische Wert von
NSNotFound
. Irgendwo im code sind Sie etwas zu tun, wieindexOfObject:
gegen ein array und übergeben das Ergebnis an, dass in Ihre Sammlung Ansicht oder layout-Methoden wie ein Abschnitt oder Element-index, der den Fehler verursacht. Dies geschieht nicht, in dem code geschrieben in deiner Frage, aber hoffentlich werden Sie in der Lage zu finden, es jetzt.InformationsquelleAutor der Antwort jrturton
Dieser arbeitete für mich:
InformationsquelleAutor der Antwort Hampden123
Ich lief einfach in dieser mich durchzusetzen. Es gefeuert, weil ich war ein Neuladen der Sammlung von Daten auf einem touch (wischen) - Ereignis.
Den ersten touch (beginnen) löste eine
didHighlightItemAtIndexPath:
Nachricht, und als Nächstes die Sammlung von Daten geändert (per wischen), und dann scheiterte es zum auslösen derdidUnhighlightItemAtIndexPath:
Meldung auf dem touch (lift).Da brauche ich nicht hervorheben, die Lösung war die Implementierung dieser Methode in meinem controller:
Ich hoffe, das hilft jemand anderes läuft in diese.
InformationsquelleAutor der Antwort Daltsy
Nie nachladen einer UICOllectionView Daten auf eine Methode ausgeführt, die durch eine gestik-Erkennung. Nach dieser Regel vollständig dieses problem gelöst. Daltsy Vorschlag zu deaktivieren highligting in der UICollectionView verhindert auch, dass der Fehler aber auch deaktiviert, alle "didSelectItemAtIndexPath" delegieren von Nachrichten. Seien Sie vorsichtig, wie Sie vielleicht am Ende mit einer fast nutzlos UICollectionView - wie ich vor ein paar Minuten.
InformationsquelleAutor der Antwort Andreas Zöllner
Anstatt deaktivieren der Hervorhebung, die ich gefunden habe, machen Sie sicher, dass keine Zellen hervorgehoben werden, vor dem Aufruf reloadData verhindert, dass der "Antrag für die Anzahl der Elemente vor dem Abschnitt" Fehler. Es ist die
UICollectionViewController.CollectionView.deselectItemAtIndexPath
Methode oder
DeselectItem
im Xamarin.Speichere ich ein handle auf das aktuell ausgewählte Element in der Modell-Daten, die klar der Ansicht Sammlung ist die Hervorhebung, neu berechnen NSIndexPaths für die Elemente, und rufen Sie dann reloadData. Das zuvor ausgewählte Element ausgewählt ist erneut mit dem Griff zu finden, der es über seinen eventuell neuen NSIndexPath Eigenschaft.
selectItemAtIndexPath:animated:scrollPosition:
oderSelectItem
im Xamarin.InformationsquelleAutor der Antwort Gary Z