2017-05-15 8 views
1

Ich habe eine Reihe von Zellen im selben Abschnitt. Wenn ich einen Knopf auf einer der Zellen drücke, möchte ich, dass er sich mit einer Animation nach unten bewegt und über die anderen Zellen bewegt. Die Animation, die ich im Sinn habe, ähnelt der beim Ziehen einer Zelle im Bearbeitungsmodus, aber ich möchte, dass sie programmgesteuert ausgeführt wird, wenn ich auf eine Schaltfläche tippe. Für das, was ich gesammelt habe, sollte ich tableView.moveRowAtIndexPath verwenden, aber ich kann nicht scheinen, richtig zu machen:Animiere UITableViewCell programmatisch nach unten bewegen

//inside the function for when the button is pressed 
let cell = sender.superview?.superview?.superview as! MainTableViewCell 
let indexPath = tableView.indexPathForCell(cell) 
let goal = goals[(indexPath?.row)!] 

goals.removeAtIndex((indexPath?.row)!) 
goals.append(goal) 

tableView.beginUpdates() 
self.tableView.moveRowAtIndexPath(indexPath!, toIndexPath: indexPaths.last!) 
tableView.endUpdates() 

tableView.reloadData() 

Danach sperrt die Funktion der Taste, die die Funktion selbst auslöst. Was ich bemerkt habe, ist, dass nicht nur die Zelle, die ich verschieben möchte, deaktiviert wird, sondern auch die letzte Zelle in der Sektion. Wenn die letzte Zelle bereits deaktiviert ist, wird die vorletzte Zelle deaktiviert und so weiter. Jede Hilfe würde sehr geschätzt werden.

EDIT: Ich rufe auch canMoveRowAtIndexPath und true zurück.

+0

Die Animation, die Sie von moveRowAtIndexPath erhalten, entspricht nicht Ihren Bedürfnissen? oder funktioniert die Animation nicht? – bbjay

+0

@bbjay Animation funktioniert nicht. – Marcel

+1

In Bezug auf dieses "seltsame" Verhalten der Schaltflächen würde ich mich niemals darauf verlassen, die Ansichten eines 'UITableViewCell's direkt zu modifizieren, während gleichzeitig die Tabellenzeilen manipuliert werden, besonders wenn '' reloadData'' folgt. Ob die Schaltfläche aktiviert werden soll oder nicht, sollte eine Information sein, die als Teil Ihres Modells gespeichert und zur Konfiguration der Zelle in 'tableView: cellForRowAtIndexPath:' verwendet wird. – crizzis

Antwort

1

Wenn Sie tableView.reloadData() anrufen, verlieren Sie Ihren Animationseffekt. Sie sollten nur in der Lage sein, die Zelle zu verschieben und dann Ihre Datenquelle (das Array goals) zu aktualisieren, um die neue Reihenfolge der Elemente widerzuspiegeln. Sie müssen auch nicht tableView.beginUpdates() und tableView.endUpdates() für ein einzelnes Update aufrufen. Sie würden diese Anrufe zu Charge mehrere Updates (Einfügungen, Löschungen, bewegt, etc.) verwenden

//inside the function for when the button is pressed 
let cell = sender.superview?.superview?.superview as! MainTableViewCell 
let indexPath = tableView.indexPathForCell(cell) 
let goal = goals[(indexPath?.row)!] 

tableView.moveRowAtIndexPath(indexPath!, toIndexPath: indexPaths.last!) 
goals.removeAtIndex((indexPath?.row)!) 
goals.append(goal) 

ich ein einfaches Testprojekt erstellt, um zu überprüfen, einfache Strings als Datenelemente verwendet wird, und der Animationseffekt arbeitete als erwartet . Siehe hier: MoveTableRow

Verwandte Themen