Hinzufügen einer Zeile in TableView iOS

8

Ich bin ziemlich neu in der iOS-Entwicklung und habe eine schreckliche Zeit, indem ich etwas versuche, das einfach sein sollte; Hinzufügen einer zusätzlichen Zeile in einer TableView, wenn der Benutzer auf eine der vorhandenen Zeilen klickt. Es gibt keinen wirklichen Zweck für diese Aktion, ich möchte nur das Verhalten von TableView verstehen.

Also habe ich folgendes gemacht:

Ich habe eine Split View-basierte Vorlage verwendet und die Anzahl der Zeilen im RootViewController auf 30 geändert.

%Vor%

Die Methode tableView: didSelectRowAtIndexPath sieht folgendermaßen aus:

%Vor%

Wenn ich das Programm ausführe und auf eines der Elemente klicke, erhalte ich den folgenden Fehler:

  
    

*** App aufgrund der nicht abgefangenen Ausnahme beenden "NSInternalInconsistencyException", Grund: "Ungültige Aktualisierung: ungültige Anzahl von Zeilen in Abschnitt 0. Die Anzahl der Zeilen in einem vorhandenen Abschnitt nach der Aktualisierung (30) muss gleich sein Anzahl der Zeilen, die in diesem Abschnitt vor der Aktualisierung enthalten sind (30), plus oder minus der Anzahl der Zeilen, die in diesem Abschnitt eingefügt oder gelöscht wurden (1 eingefügt, 0 gelöscht). '

  

Ich habe keinen anderen Teil des von der Vorlage bereitgestellten Codes geändert.

Ich habe die Dokumentation von Apple und die Antworten auf die folgenden Fragen ausführlich gelesen: Fügen Sie eine Zeile dynamisch in TableView of iphone hinzu und Wie verwendet man insertRowsAtIndexPaths richtig?

Die zweite Frage scheint das gleiche Problem anzugehen, aber ich bin nicht in der Lage zu verstehen, was passiert. Was meinen sie mit dataSource? Die Antwort, die ich besser verstehe, sagt folgendes:

  
    

Es ist ein zweistufiger Prozess:     Aktualisieren Sie zuerst Ihre Datenquelle, damit numberOfRowsInSection und cellForRowAtIndexPath die korrekten Werte für Ihre Post-Insert-Daten zurückgeben. Sie müssen dies tun, bevor Sie Zeilen einfügen oder löschen, oder Sie sehen den Fehler "ungültige Anzahl von Zeilen", den Sie erhalten.

  

Was bedeutet dieses Update der Datenquelle?

Beispielcode wäre sehr geschätzt, weil ich total frustriert bin.

Übrigens, alles, was ich versuche, hat nichts damit zu tun, den Bearbeitungsmodus zu betreten, oder?

    
AlvaroSantisteban 31.05.2012, 17:08
quelle

4 Antworten

14

Sie müssen die von tableView:numberOfRowsInSection: zurückgegebene Anzahl synchron halten!

Wenn Sie also 30 Zeilen haben und dann die Tabellenansicht anweisen, eine neue Zeile einzufügen, müssen Sie sicherstellen, dass tableView:numberOfRowsInSection: jetzt 31 zurückgibt.

%Vor%

In der Praxis würden Sie wahrscheinlich ein Array verwenden, um Ihre Zeilen return [self.rows count]; etc

zu verfolgen     
trapper 31.05.2012, 17:12
quelle
3

Die Antwort ist ziemlich einfach. Wenn Sie eine Tabellenansicht ändern möchten, müssen Sie zwei einfache Schritte ausführen:

  1. Behandeln Sie das Modell
  2. Behandle die Tabellenanimation

Sie führen den zweiten Schritt bereits durch. Aber du hast die erste verpasst. Wenn Sie mit einer Tabelle arbeiten, übergeben Sie ihr normalerweise eine Datenquelle. Mit anderen Worten, einige Daten werden darin angezeigt.

Ein einfaches Beispiel ist die Verwendung von NSMutableArray (dynamisch wie der Name sagt), die Dummy-Daten enthält.

Erstellen Sie beispielsweise eine Eigenschaft wie die folgende in .h

%Vor%

und in .m synthetisieren es als:

%Vor%

Nun können Sie alloc-init dieses Array eingeben und es wie folgt auffüllen (zum Beispiel in viewDidLoad Methode Ihres Controllers).

%Vor%

Anstatt die Anzahl der Zeilen, die angezeigt werden (30 in Ihrem Fall), fest zu codieren, können Sie Folgendes tun:

%Vor%

Jetzt können Sie in Ihrem didSelectRowAtIndexPath delegate ein drittes Element hinzufügen.

%Vor%     
Lorenzo B 31.05.2012 17:26
quelle
2

Es sieht so aus, als wäre ein großes Problem mit tableView:numberOfRowsInSection: . Sie müssen die korrekte Anzahl der Zeilen in dieser Methode zurückgeben.

Um dies zu tun, ist es normalerweise am besten, ein NSArray oder NSMutableArray von Elementen für die Tabellenansicht zu pflegen, also können Sie in dieser Funktion sagen: return [arrayOfValues count]; . Behalten Sie das Array als eine Eigenschaft Ihrer View-Controller-Klasse bei, so dass es in allen Methoden leicht zugänglich ist.

Das Array kann auch in cellForRowAtIndexPath: verwendet werden. Wenn Sie ein Array von NSString haben, können Sie cell.text = [arrayOfValues objectAtRow:indexPath.row]; sagen.

Wenn Sie dann ein Element zur Tabellenansicht hinzufügen möchten, können Sie es einfach zum Array hinzufügen und die Tabelle erneut laden, z. [tableView reloadData]; .

Versuchen Sie, dieses Konzept zu implementieren und lassen Sie mich wissen, wie es geht.

    
woz 31.05.2012 17:12
quelle
0

Sie können das auch für dayanamic table cell

tun %Vor%     
Sumit singh 07.10.2014 15:05
quelle

Tags und Links