UICollectionView nicht aktualisieren ordnungsgemäß verwendet THStringyFlowLayout
Wenn meine app gestartet wird, es nimmt die Daten aus dem Persistenz und zeigt 5 Zellen in meiner Sammlung Ansehen. Diese Zellen sieht aus wie normales TableView-Zellen, aber ich benutze Sammlung Anzeigen für den späteren layout-tweaks. Es dauert 8 Zellen zu füllen den ganzen Bildschirm.
Einer Sekunde danach, wird das Modell aktualisiert mit den Daten für 19 Zellen und der Kollektion-Ansicht wird aktualisiert durch aufrufen:
[self.collectionView reloadData];
Diejenigen, die bereits angezeigt 5 Zellen sind schön aktualisiert mit neuen Daten, aber das ist es. Die anderen Zellen werden nicht angezeigt, bis ich den Bildschirm berühren und nach unten scrollen, um die Höhe der Zelle. Dann sofort 3 Zellen angezeigt und füllt den Bildschirm. Von diesem moment an, ist alles gut, aber bis ich scrollen, es ist nicht korrekt aktualisiert.
Wenn ich es ausgetestet habe, sehe ich, dass die collectionView:numberOfItemsInSection: heißt nach dem Aufruf von reloadData und es gibt richtige Nummer 19, aber die collectionView:cellForItemAtIndexPath: ist gefragt, gerade für diejenigen, die 5 Zellen (bis ich scrollen).
Art von verzweifelten hier, vielen Dank für deine Hilfe.
Bearbeiten - Hinzugefügt-Quellcode:
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return [self.manager.jubilees count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
DLog(@"asked for cell: %i", indexPath.row); //just for debugging to know, what is going on
JUJubileeCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"JubileeCell"
forIndexPath:indexPath];
cell.jubilee = self.manager.jubilees[(NSUInteger) indexPath.row];
return cell;
}
//called when model is updated
-(void)jubileesUpdated {
DLog(@"jubileesUpdated");
[self.collectionView reloadData];
}
edit 2:
Wenn die ersten 5 Zellen geladen werden, die [selbst.collectionView contentSize] ist (width=320, height=358).
Wenn die alle 19 Zellen geladen werden und reloadData genannt, contentSize ist (width=320, height=1366) - aber die Zellen werden nicht angezeigt :(.
edit 3:
Das problem ist verursacht durch die Verwendung THStringyFlowLayout - ich werde mehr posten, wenn ich die Ursache finden.
- Was passiert, wenn Sie nicht navigieren, sondern warten, wie eine minute oder so??? Könnte sein thread im Zusammenhang. Spät erscheinenden Zellen sind die Symptome der Anrufe aus einem thread, der nicht der Haupt-thread. So stellen Sie sicher, dass reloadData ist aufgerufen, aus dem mainThread. Zum Beispiel, indem ein
NSAssert([NSThread isMainThread], @"not on main thread");
vorreloadData
. Das ist im Grunde das einzige problem, das ich mir vorstellen kann mit so einem Ergebnis. - Es ist sehr guter Punkt, aber leider ist es aktualisiert, auf dem Haupt-thread :(. Ich schon abgeschaltet alle multithreading, wenn ich beginnen, sich mit diesem Thema beschäftigt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, die index-Pfade, die Sie aktualisieren möchten in ein array und verwenden Sie die
[_collectionView reloadItemsAtIndexPaths:arayOfAllIndexPaths]
Laden Sie Ihre Sammlung anzeigen auf dem Haupt-thread
dispatch_async(dispatch_get_main_queue(), ^{ });
Dies ist meist ein Schuss im Dunkeln, aber das klingt wie könnte es eine redraw-Fehler. Schicken Sie
-setNeedsDisplay
zu der Ansicht Sammlung, um es selbst aktualisieren.Es ist schwer zu erraten, ohne zu sehen, keine eigentliche code, aber stellen Sie sicher, dass die Dimensionen der Zellen sind Recht, entweder von Ihrem Einzelteil-Größe delegieren oder die aus den Parametern auf der flowlayout (was auch immer Sie verwenden).
Für das, was Sie beschrieben haben, scheint es, dass die Sammlung Blick denkt, dass nur 3 Zellen sichtbar sind, und da die Zelle laden faul ist gemäß der gezeigten Zellen ist es nur dequeueing die ersten 3.
Edit: auch stellen Sie sicher, dass Sie übergeben das Recht indexPath der dequeuecell Methode.
Alle, vielen Dank für die Hilfe!
Das problem ist irgendwo in der Flow-Layout. Ich bin mit THSpringyFlowLayout (das ist der Grund, warum ich mich eigentlich mit Auflistung Anzeigen) und ohne, alles ist in Ordnung.