iOS 7 beginUpdates endUpdates ist inkonsistent

8

Bearbeiten : Die Lösung für diese Antwort bezieht sich auf iOS7, die manchmal NSIndexPath und andere Male NSMutableIndexPath zurückgibt. Das Problem war nicht wirklich mit begin/endUpdates verbunden, aber hoffentlich wird die Lösung anderen helfen.

Alle - Ich verwende meine App auf iOS 7 und es treten Probleme mit den Methoden beginUpdates und endUpdates für UITableView auf.

Ich habe eine Tabellenansicht, die die Höhe einer Zelle ändern muss, wenn sie berührt wird. Unten ist mein Code:

%Vor%

Die Methoden beginUpdates und endUpdates funktionieren ziemlich inkonsistent. Die didSelectRowAtIndexPath -Methode wird bei jeder Berührung korrekt aufgerufen (ich dachte zuerst, dass die Benutzeroberfläche blockiert wurde) und die selectedIndexes speichert alternierende Werte korrekt. Das Problem ist, manchmal berühre ich eine Tabellenzelle und alle Methoden werden korrekt aufgerufen, aber die Zellenhöhe ändert sich nicht. Weiß jemand, was vor sich geht?

    
coder 20.09.2013, 14:38
quelle

2 Antworten

21

Es gibt eine Änderung im Verhalten in iOS7, wo Indexpfade manchmal Instanzen von NSIndexPath und anderen Zeiten UIMutableIndexPath sind. Das Problem ist, dass isEqual zwischen diesen beiden Klassen immer NO zurückgibt. Daher können Sie Indexpfade nicht zuverlässig als Dictionary-Schlüssel oder in anderen Szenarios verwenden, die auf isEqual basieren.

Ich kann mir ein paar brauchbare Lösungen vorstellen:

  1. Schreiben Sie eine Methode, die immer eine Instanz von NSIndexPath zurückgibt und sie zum Generieren von Schlüsseln verwendet:

    %Vor%
  2. Identifizieren Sie Zeilen anhand der Daten und nicht anhand des Indexpfads. Wenn Ihr Datenmodell beispielsweise ein Array von NSString ist, verwenden Sie diese Zeichenfolge als Schlüssel für Ihre selectedIndexes -Map. Wenn Ihr Datenmodell ein Array von NSManagedObjects ist, verwenden Sie objectID , usw.

Ich verwende beide Lösungen erfolgreich in meinem Code.

BEARBEITEN Modifizierte Lösung (1) basierend auf dem Vorschlag von @ rob, NSIndexPaths anstatt NSStrings zurückzugeben.

    
Timothy Moose 20.09.2013, 15:33
quelle
0

endUpdates sollte nicht unmittelbar nach beginUpdates aufgerufen werden. Die Dokumentation des letzteren besagt: "Beginnen Sie eine Reihe von Methodenaufrufen, die Zeilen und Abschnitte des Empfängers einfügen, löschen oder auswählen." Dies deutet darauf hin, dass es in willSelectRowAtIndexPath: aufgerufen werden sollte und endUpdates in didSelectRowAtIndexPath aufgerufen werden sollte.

    
NRitH 20.09.2013 15:04
quelle