TableViewを並び替えた後のデータ更新とCellの更新について
こんにちは。
調べてもどうしても出てこなくて困っています。
UITableViewの並び替えた時のセルの更新について質問させていただきます。
func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
//一時的に保存
let cellData = cellDatas[sourceIndexPath.row]
cellDatas.removeAtIndex(sourceIndexPath.row)
cellDatas.insert(cellData, atIndex: destinationIndexPath.row)
}
と、このようにデータソースを入れ替えるようにすると思うのですが
この後にどうしてもtableViewのセルの更新を行いたくて、
func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
//一時的に保存
let cellData = cellDatas[sourceIndexPath.row]
cellDatas.removeAtIndex(sourceIndexPath.row)
cellDatas.insert(cellData, atIndex: destinationIndexPath.row)
//リロードを追加
tableView.reloadData()
}
このようにするとセルのデータは確かに更新されるのですが、
≡ をつかんで離した時の挙動が早すぎて不自然です。そこで
func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
//一時的に保存
let cellData = cellDatas[sourceIndexPath.row]
cellDatas.removeAtIndex(sourceIndexPath.row)
cellDatas.insert(cellData, atIndex: destinationIndexPath.row)
//リロード開始
tableView.beginUpdates()
tableView.moveRowAtIndexPath(sourceIndexPath, toIndexPath: destinationIndexPath)
tableView.endUpdates()
//リロード終了
}
と書いてみたのですが今度は正常にセルがリロードされません。
セルをリロードしたい理由につきましては、セルの持つ部品のプロパティに現在のCellの行番号を保持させて置きたいのです。(以下を ≡ を動かした後もう1度呼びたい)
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//この中でcellの持つ部品のプロパティに値を設定する
let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath:indexPath) as! CustomCell
cell.view.row = indexPath.row
}
おかげさまで解決しました。ありがとうございます。
この質問の下にコメントを残したのですが、マークダウンに慣れていなくて、見にくくなってしまいました。
コードだけでも書き直したいと思います。申し訳ございません。
CustomCellのプロパティにクロージャをもたせておいて
var buttonTapAction = {}
セルを返却するメソッドでViewController内のメソッドを渡して
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath:indexPath) as! CustomCell
cell.buttonTapAction = {self.buttonTapAction(cell)}
}
同じViewController内のメソッド(ここではbuttonTapAction(_:))を用意
func buttonTapAction(cell:TextTableViewCell) {
let row = tableView.indexPathForCell(cell)?.row
//rowを使った処理
}
と別の部分で取得することができました。