UITableViewをアコーディオンっぽくする方法(簡易版)
上記のサイトを参考に、アコーディオンの様に親要素タップで子要素を展開するUITableViewを実装しました。
※参考サイトはObjective-cですが、Swiftで書き直しました。
まず、削除処理を追加しました。削除処理は、
・子要素単独では消せない(削除ボタンも出ない)
・親要素を削除すると、子要素もすべて削除される
という風にしました。この処理はうまく動きました。
続いて、セルの入れ替え処理を実装しようと試みました。
入れ替え処理は、
・子要素は入れ替え不可
・親要素は入れ替え可能
・子要素展開時は入れ替え不可(子要素が全て閉じている時のみ、親要素を入れ替え可能)
しかしこれがうまく動きません。
見た目上、入れ替わった様に見えるのですが、タップして子要素を展開しようとするとエラーが発生してしまいます。
少し調べてみると、入れ替え完了時に呼ばれるメソッド
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
の、destinationIndexPathが想定している値ではないことがわかりました。
例えば、親要素1(配列index:0)をドラッグして、親要素2(配列index:1)と入れ替えるとします。
この時、
sourceIndexPath.section = 0
sourceIndexPath.row = 0
destinationPath.section = 1
destinationPath.row = 0
となると想定して処理を書いていたのですが、デバッガで値を見てみるとdestinationの方が、
destinationPath.section = 1
destinationPath.row = 1 // <--
になっていました。
恐らくこれが原因で、TableViewとデータを格納している配列にズレが発生してエラーとなっているのだと思います。
親要素を入れ替えるにはどうすれば良いのでしょうか。
以上、よろしくお願い致します。
あなたの回答
tips
プレビュー