2009-05-14 9 views
1

******** aktualisieren **********Was macht die UITableView-Methode "deleteRowsAtIndexPaths: withRowAnimation:"?

auf Frage Wenn der Tableview nicht das Modell nicht beeinflusst: der Indexpfad von Onscreen-Zellen verändert ihre aktuelle Position zu reflektieren ODER sind die Indizes gelöschter Zellen unsichtbar, bis reloadData aufgerufen wird?

******* Original Question **********

Ich weiß, dass es die Zellen zum Löschen markiert und belebt die Löschung, aber was es zum Modell tut?

Hat es Auswirkungen auf das Modell überhaupt (ich kann mir nicht vorstellen, dass es tut)?

Sind die Zellen "noch da" aber unsichtbar?

Wenn der Benutzer scrollt, überspringt er Delegiertenaufrufe für die gelöschten Indizes?

Erwartet Sie, dass Sie das Modell aktualisieren?

scheint vage von dem, was ich bisher ...

Antwort

5
  • (void) DeleteRowsAtIndexPaths gelesen haben: (NSArray *) indexPaths withRowAnimation: (UITableViewRowAnimation) Animation;

Löscht eine Zeile (n) aus der TabelleView. Es ändert Ihr Modell überhaupt nicht. Das musst du selbst machen. Die Zellen werden gelöscht, aber wenn Sie reloadData aufrufen, bevor Sie die Zeile aus Ihrem Modell löschen. Die Zelle wird wieder angezeigt.

Also ja, es erwartet, dass Sie Ihr Modell aktualisieren.

+0

der Index Weg der Onscreen-Zellen ihre aktuelle Position verändert zu reflektieren oder sind die Indizes der gelöschten Zellen unsichtbar, bis reloadData aufgerufen wird? –

+4

Sie müssen die -reloadData nicht aufrufen, nachdem Sie die Methoden -insert oder -delete verwendet haben. Diese werden die eigene Zeilenliste der Tabellenansicht entsprechend aktualisieren.Was die Indizes betrifft, wird in der Tabellenansicht gefragt, welches Element sich in einem bestimmten Indexpfad befindet. Es liegt also an Ihnen, Ihr Modell zu ändern, sodass Sie bei der Anforderung einer neuen Zeile in der Tabellenansicht die richtige Zeile angeben. –

+0

Das macht Sinn, die Methoden delete und insert sagen nur, dass die Tabelle kontrahiert oder erweitert werden soll. Dann können Sie bei Bedarf einfach das gesamte Modell-Array austauschen –

1

UITableView ist ein VIEW erinnern, dass UIKit stark MVC basiert. Es liegt in Ihrer Verantwortung, das Modell auf dem neuesten Stand zu halten. Tatsächlich würde Ihr Controller wahrscheinlich (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; als Reaktion auf die Beobachtung (oder Benachrichtigung) einer Änderung in Ihrem Modell anrufen.

Zum Beispiel sagen Sie UI hat eine "10 zufällige Elemente löschen". Die richtige Strömung hierfür ist:

  1. Ansicht - Benutzer drückt Taste
  2. Controller -
  3. Ansicht aktualisiert Liste

in Modell beobachtet Änderung Obwohl - erhält

  • Controller-Taste drücken Aktuelles Modell es fühlt sich ein wenig ausgedacht - warum nicht die Ansicht aktualisieren Sie einfach die Liste und sagen Sie dem Modell? es wird bette rcode einfacher verständlich machen und das funktioniert besser mit UIKit. Dieser Entwurf geht beispielsweise nicht davon aus, dass der Controller in 2 und 3 derselbe Controller ist, so dass Sie mehr Flexibilität haben.

    Ich würde normalerweise YAGNI gelten Entwurf zu erledigen, aber ich glaube, dass der starke Fokus os UIKit MVC bedeutet, dass YAGNT (Sie werde ...)

  • +0

    Das ist eigentlich genau das, was ich an Ort und Stelle habe. Mein einziger Streitpunkt ist, dass die Tabellenansicht den Übergang animiert. Das erneute Laden der Daten tut dies nicht. Ich muss auf die Änderungen in den Daten hinweisen, um die Animation zu erhalten (soweit ich es sagen kann). –

    +0

    Wenn Ihre Daten korrekt sind, funktioniert reloadData. Sie sollten das im Debugger sicherstellen. Ihr Controller kann 'deleteRowsAtIndexPaths' auch verwenden, wenn er weiß (und es sollte :-)), was aus dem Modell gelöscht wurde. –

    +0

    Ich führe einen ganzen Verkaufstausch des Modells durch (Ersetzen eines Arrays durch ein anderes). Also, eigentlich weiß es nicht. Ich muss es durch und berechnen, was ist unterschiedlich zwischen den 2 Arrays innerhalb der Steuerung und dann "deleteRowsAtIndexPaths" aufrufen. Ich dachte nur, dass das ein wenig übertrieben war, aber jetzt merke ich, dass die meisten Leute vielleicht nicht das Modell aktualisieren, wenn sie die Animationsfunktionen benutzen. –