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?
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:
Schreiben Sie eine Methode, die immer eine Instanz von NSIndexPath
zurückgibt und sie zum Generieren von Schlüsseln verwendet:
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.
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.
Tags und Links objective-c uitableview ios ios7 nsindexpath