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"); vor reloadData. 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.
InformationsquelleAutor Alois Holub | 2014-03-11
Schreibe einen Kommentar