2017-05-15 16 views
1

同じセク​​ションに一連のセルがあります。私がセルの1つのボタンを押すと、他のセルに移動するアニメーションを下に移動したいと思います。私が念頭に置いているアニメーションは、編集モードでセルをドラッグするとどうなるかと似ていますが、ボタンをタップするとプログラムで実行したいと思います。私が集めたもの 、私はtableView.moveRowAtIndexPathを使用する必要がありますが、私はそれを正しく行うように見えることはできませんの場合:この後アニメーションのUITableViewCellがプログラム的に下に移動

//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() 

、関数は関数自体をトリガーボタンを無効にします。私が起こったことに気づいたことは、私が移動したいセルが無効になるだけでなく、セクションの最後のセルも同様です。最後のセルがすでに無効になっている場合は、最後のセルが無効になるなどします。 ご協力いただければ幸いです。

編集:canMoveRowAtIndexPathとも呼ばれ、trueを返します。

+0

あなたがmoveRowAtIndexPathから得たアニメーションは、あなたの必要性に合っていませんか?またはアニメーションが機能していないのですか? – bbjay

+0

@bbjayアニメーションが動作していません。 – Marcel

+1

この '奇妙な'ボタンの動作に関しては、特に 'reloadData'の後にテーブル行を同時に操作しながら、' UITableViewCell'のビューを直接変更することに頼ることはありません。ボタンを有効にするかどうかは、モデルの一部として保持される情報の一部でなければならず、 'tableView:cellForRowAtIndexPath:'で適切にセルを設定するために使用されます。 – crizzis

答えて

1

tableView.reloadData()に電話すると、アニメーション効果が失われます。セルを移動し、データソース(goalsアレイ)を更新して、アイテムの新しい順序を反映できるようにするだけです。また、1回の更新でtableView.beginUpdates()tableView.endUpdates()に電話する必要はありません。あなたは、データ項目として、単純な文字列を使用して、私が確認するための簡単なテストプロジェクトを作成し

//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) 

バッチ複数の更新(挿入、削除、移動など)にこれらの呼び出しを使用して、アニメーション効果は期待通りに働いていました。ここに要点を見てください:MoveTableRow

関連する問題