

こんにちは。  
調べてもどうしても出てこなくて困っています。  
UITableViewの並び替えた時のセルの更新について質問させていただきます。

* * *
[code]

    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)   
    }
    
[/code]

と、このようにデータソースを入れ替えるようにすると思うのですが  
この後にどうしてもtableViewのセルの更新を行いたくて、

[code]

    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()  
    }
    
[/code]

このようにするとセルのデータは確かに更新されるのですが、  
≡ をつかんで離した時の挙動が早すぎて不自然です。そこで

[code]

    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()
        //リロード終了
    }
    
[/code]

と書いてみたのですが今度は正常にセルがリロードされません。

* * *

セルをリロードしたい理由につきましては、セルの持つ部品のプロパティに現在のCellの行番号を保持させて置きたいのです。(以下を ≡
を動かした後もう1度呼びたい)

[code]

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        //この中でcellの持つ部品のプロパティに値を設定する
        let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath:indexPath) as! CustomCell
        cell.view.row = indexPath.row
    }
    
[/code]

* * *

* * *

* * *

おかげさまで解決しました。ありがとうございます。  
この質問の下にコメントを残したのですが、マークダウンに慣れていなくて、見にくくなってしまいました。  
コードだけでも書き直したいと思います。申し訳ございません。

CustomCellのプロパティにクロージャをもたせておいて

[code]

    var buttonTapAction = {}
    
[/code]

セルを返却するメソッドでViewController内のメソッドを渡して

[code]

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath:indexPath) as! CustomCell 
        cell.buttonTapAction = {self.buttonTapAction(cell)} 
    } 
    
[/code]

同じViewController内のメソッド(ここではbuttonTap‌​Action(_:))を用意

[code]

    func buttonTapAction(cell:TextTableViewCell) { 
        let row = tableView.indexPathForCell(cell)?.row 
        //rowを使った処理
    }
    
[/code]

と別の部分で取得することができました。


CC BY-SA 3.0
2016-10-21T18:25:16.120
29785
2016-10-23T14:58:58.843
2016-10-23T14:58:58.843
19269
19269
question
swift ios tableview
TableViewを並び替えた後のデータ更新とCellの更新について


質問者さんの意図を完全に理解した自信はないのですが、リロードを遅らせたいのでしたら、GCD（Grand Central
Dispath）等を利用して、遅延処理することになるでしょう。

_Swift 3_

[code]

    func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        let cellData = cellDatas[sourceIndexPath.row]
        cellDatas.removeAtIndex(sourceIndexPath.row)
        cellDatas.insert(cellData, atIndex: destinationIndexPath.row)
        // 1秒遅らせてリロード
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(1), execute: {tableView.reloadData()})  
    }
    
[/code]

_Swift 2_

[code]

    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)
        // 1秒遅らせてリロード
        let delayTime = dispatch_time(DISPATCH_TIME_NOW, (NSEC_PER_SEC * 1))
        dispatch_after(delayTime, dispatchQueue, {tableView.reloadData()})
    }
    
[/code]


CC BY-SA 3.0
2016-10-21T23:42:55.370
29787
2016-10-21T23:42:55.370
18540
29785
answer