2014-10-10 3 views
5

Ich habe eine Tabellenansicht mit zwei Reihen in einem Abschnitt, dhWie sollte in einer iOS-Tabellenansicht eine Zeile in einen neuen Abschnitt verschoben werden?

--- 
Row A 
Row B 

Wenn ich will, Reihe 1 in einen neuen Abschnitt animieren, dh das Sein Ergebnis:

--- 
Row B 
--- 
Row A 

wie sollte diese erreicht werden? Was habe ich schon versucht ist:

[self.tableView beginUpdates]; 
[self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow: 0 inSection: 0]] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView insertSections:[NSIndexSet indexSetWithIndex: 1] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 

jedoch in iOS 8 zumindest, beseelt die Reihe, aber dann wird der neue Abschnitt ist un-übertragene (dh weiß, keine untere Reihe Grenze) bis einige Zeit nach, wenn etwas löst ein Redraw aus und es kommt zurück.

[self.tableView beginUpdates]; 
[self.tableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] toIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]]; 
[self.tableView endUpdates]; 

, die eine Ausnahme aufwirft:

Invalid update: invalid number of sections. The number of sections contained in the table view after the update (2) must be equal to the number of sections contained in the table view before the update (1), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted). 

Und:

[self.tableView beginUpdates]; 
[self.tableView insertSections:[NSIndexSet indexSetWithIndex: 1] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] toIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]]; 
[self.tableView endUpdates]; 

, die die Ausnahme auslöst:

cannot move a row into a newly inserted section (1) 

Soll ich überhaupt nur nicht animieren und laden die ganze Tabelle?

+0

Vielleicht besser, die Datenschicht mit der Ansichtsebene zu trennen. I.e. Laden Sie Ihre Daten mit entworfenen Datenquelle, vielleicht 2-D-Array, dann ändern Sie das Array und rufen Sie tableView.Reload – zcui93

Antwort

0
+0

Ich habe das versucht. Ich habe auch versucht, den Abschnitt einzufügen und dann die Reihe zu verschieben. Beide erzeugen Ausnahmen. – Nick

+0

Wenn Sie nur verschieben, erhalten Sie: Ungültige Aktualisierung: ungültige Anzahl der Abschnitte. Die Anzahl der Abschnitte in der Tabellenansicht nach dem Update (2) muss der Anzahl der Abschnitte in der Tabellenansicht vor dem Update entsprechen (1), plus oder minus der Anzahl der eingefügten oder gelöschten Abschnitte (0 eingefügt, 0 gelöscht). – Nick

+0

Wenn Sie den Abschnitt einfügen und dann verschieben, erhalten Sie: eine Zeile kann nicht in einen neu eingefügten Abschnitt verschoben werden (1) – Nick

0

ich in einer ähnlichen Situation war, wo ich cannot move a row into a newly inserted section (1) die Ausnahme bekam. Ich fand nur zwei halbe Lösungen.

  1. neu laden Sie die Tabelle mit reloadData() - aggressiv und keine Animationen
  2. löschen und Ihre Zeilen einfügen, Code unten:

self.requestTableView.deleteRowsAtIndexPaths([oldIndexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 
self.requestTableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 

Um Animationen Effekte zu erhalten, die den Eindruck erwecken, von Wenn Sie die Zeilen verschieben, können Sie beim Löschen, Einfügen oder erneuten Laden von Abschnitten UITableViewRowAnimation.Top verwenden.

self.tableView.deleteSections(toDelete, withRowAnimation: UITableViewRowAnimation.Top) 
self.tableView.insertSections(toInsert, withRowAnimation: UITableViewRowAnimation.Top) 
self.tableView.reloadSections(toReload, withRowAnimation: UITableViewRowAnimation.Top) 
4

Sie müssen dies in zwei Schritten durchführen.

Zuerst müssen Sie den Abschnitt hinzufügen; Sie müssen Ihrer Datenquelle mitteilen, dass sie für den neuen Abschnitt verantwortlich ist. Für ein einfaches Beispiel wie das Ihre, können Sie einstellen, nur eine Variable:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    if(hasTwoSections) 
     return 2; 

    return 1; 
} 

dann an dem die Animation auslösen wollen, rufen:

hasTwoSections = true; // this needs to be set before endUpdates 
[self.tableView beginUpdates]; 
[self.tableView insertSections:[NSIndexSet indexSetWithIndex: 1] withRowAnimation:UITableViewRowAnimationAutomatic]; 
[self.tableView endUpdates]; 

An diesem Punkt wird die Tableview die Datenquelle aufrufen Methoden zum Aktualisieren der Tabelle basierend auf Ihren Änderungen.

Sobald der Abschnitt hinzugefügt wurde, können Sie die Zeile, um es in einem anderen Aktualisierungsblock bewegen:

[self.tableView beginUpdates]; 
[self.tableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] toIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]]; 
[self.tableView endUpdates]; 

Offensichtlich müssen Sie aktualisieren, was numberOfRowsInSection für die Änderung zu berücksichtigen, zurückgibt.

Obwohl es zwei Schritte ist, wird es aussehen, als ob es auf einmal passiert.

+0

Wenn Sie nur eine Operation ausführen, werden die beginUpdates und endUpdates nicht benötigt. –

+0

Das stimmt, die Aufrufe 'beginUpdates' und' endUpdates' sind in diesem Beispiel nicht notwendig. – spongessuck

Verwandte Themen