UICollectionView-Absturz bei unhighlightAllItems

8

Ich habe mehrere Absturzberichte bezogen auf eine UICollectionView in iOS 7 erhalten. Ich kann diesen Absturz nicht konsistent neu erstellen.

%Vor%

Die UICollectionViewCells in der App teilen eine gemeinsame Superklasse, die Hervorhebungen verwaltet. Wenn die Zelle markiert ist, ändert sich das Alpha.

%Vor%

Könnte das Aufrufen von [super setHighlighted: highlighted] zu einem solchen Absturz führen? Die App wurde mit XCode 4 kompiliert und eingereicht und läuft nur auf iOS 7. Irgendwelche anderen Vorschläge, um herauszufinden, wo das passiert. Danke für deine Hilfe.

Bearbeiten: Ich konnte dies im Debugger abfangen, aber es ist immer noch nicht konsistent reproduzierbar. Der Absturz ist:

%Vor%     
Scott Bossak 26.09.2013, 15:48
quelle

4 Antworten

4

Wenn Sie reloadData aufrufen, während der Benutzer die Ansicht zieht, könnte das der Grund sein.

Ich hatte Abstürze im Zusammenhang mit ähnlichen Absturzberichten und "reparierte" das Problem, indem ich den reloadData-Aufruf verzögerte, bis der Benutzer mit dem Scrollen der Ansicht fertig war. Z.B. Erstellen Sie eine umbrochene Methode, anstatt reloadData direkt aufzurufen.

%Vor%

Wenn der Bildlauf beendet ist, rufen Sie die Methode updateData (falls erforderlich) aus den Delegate-Methoden der Bildlaufansicht auf.

%Vor%

Meine Vermutung ist, dass es irgendwo innerhalb der collectionView einen schwachen Verweis auf den Indexpfad der markierten Zelle gibt, und dass das Aufladen des Aufrufs den Indexpfad auflöst. Wenn die CollectionView dann versucht, die Zelle zu heben, stürzt sie ab.

BEARBEITEN:

Wie in den Kommentaren unten erwähnt, hat diese "Lösung" einige Mängel. Bei der Untersuchung des Problems scheint es, dass das Problem in meinem Fall mit mehreren reloadData-Aufrufen zu tun hatte, die während des Ziehens der Sammlungsansicht in den Hauptthread eingereiht wurden. Wenn es nur einen reloadData-Aufruf gab, war alles in Ordnung, aber wann immer es mehr als einen gab - crash!

Da ich in meiner Sammlung immer genau einen Abschnitt hatte, habe ich den Aufruf reloadData durch

ersetzt %Vor%

Dies führt jedoch dazu, dass die Zellen schnell ausgeblendet und wieder eingefügt werden, was ich mit der folgenden Methode vermieden habe (es wäre wahrscheinlich besser als Kategorie in der Sammlungsansicht)

%Vor%

Bisher hat das für mich gut funktioniert und es ermöglicht auch, dass die Daten während des Scrollens aktualisiert werden.

    
toostn 26.11.2013 18:30
quelle
1

Nicht sicher, nachdem nur dieser Code identifiziert wurde. Aber als Crash-Signal (SIGSEGV) scheint wegen Speicherverlust. Sie gehen einfach zu Ihrer Xcode-Einstellung und in Edit Scheme, aber aktivieren Sie die Zombie-Option und versuchen Sie dann, Ihren Absturz zu reproduzieren. Es zeigt Ihnen den Controller-Klassennamen der Methode oder alle crash-bezogenen Informationen in der Xcode-Konsole an. Und versuchen Sie auch, Ihre Bedingung unten zu ändern: -

%Vor%     
Hussain Shabbir 10.10.2013 15:14
quelle
1

Ich hatte dieses Problem, obwohl ein etwas anderer Absturz. Wird behoben, indem alle reloadData angehalten werden, bis die Hervorhebung gelöscht ist. Während der Vorschlag von toostn das Problem beheben würde, ist es nützlich, Daten während des Scrollens neu laden zu können, aber das macht keinen Sinn, wenn Sie markieren - wenn Sie Ihren Finger auf einer Zelle haben.

Implementieren Sie die folgenden UICollectionViewDelegate-Methoden:

%Vor%     
Nick H247 08.04.2014 12:34
quelle
0

Ich hatte auch diesen Absturz in _unhighlightAllItems in einer Sammelansicht, wo ich einen langen Druckerkenner verwendet habe, der den Zustand der Zellen (aber nicht ihre Anzahl) ändert und dann [collectionView reloadData] heißt. In meinem Fall funktioniert die Lösung von @toostn (mit performBatchUpdates ) großartig.

Ich habe auch festgestellt, dass die Verwendung von reloadItemsAtIndexPaths: anstelle von reloadData auch den Absturz vermeidet.

    
Gereon 11.06.2014 22:04
quelle