20598


UITableViewのセルを、セル内のボタン（UIButton）を押したときに、ボタンを押したセルが削除される仕様を実装したいと考えています。  
（Twitterでのフォローリクエストを拒否したときのセルが削除されるイメージ）  
しかし、検索しても編集モードを用いたセルの削除しかヒットせず、どうすればよいのか途方に暮れています。

編集モードを用いた方法しかヒットしないことを考えると  
もしかしたら、編集モードをうまく応用してセル内のボタンが押されたときに編集モードを開始して、セルを削除しているのかもしれませんが、どうすればよいのか全く見当がつきません。

なにかありましたら、随時補足させていただきますので  
よろしくお願い致します。


CC BY-SA 3.0
2016-01-04T10:04:05.203
20586
2016-01-05T08:30:31.613
2016-01-04T10:41:30.583
7362
12470
question
ios swift
UITableViewのセルの削除


ボタンが押された時点で、対応するセルのNSIndexPathが取得できるはずなので、それを用いてdeleteRowsAtIndexPaths()を呼ぶのが良いかと思います。

具体的には、こんな感じになるかと思われます。

[code]

    // 表示に使用している内部のデータを削除
    
    // IndexPathを指定してUITableViewのセルを削除
    tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
    
[/code]


CC BY-SA 3.0
2016-01-04T11:36:06.377
20593
2016-01-04T11:36:06.377
7459
20586
answer


# 以下の３つのステップで実装できます。

  1. ボタンをUITableViewControllerのサブクラスのメソッドへ紐づける
  2. 押されたボタンから、ボタンの乗っているCellのIndexPathを取得
  3. 取得したIndexPathを利用してCellを削除

* * *
[code]

    @IBAction func btn(sender: UIButton) {
    
        // IndexPathを取得 (押されたボタンが乗っているCellから)
        let cell = sender.superview?.superview as? UITableViewCell
        let indexPath = self.tableView.indexPathForCell( cell! )
    
    
        // Cellの削除処理
        self.tableView.beginUpdates()
    
        self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
        self.dataSource.removeAtIndex(indexPath!.row)
    
        self.tableView.endUpdates()
    
    
    }
    
[/code]

* * *

# IndexPath取得

IndexPathの取得方法はボタンの配置によって変わるので、上記のコードで動かない場合は、変更してください。

# Cellの削除処理

### 処理の記載場所

self.tableView.beginUpdates()  
と  
self.tableView.endUpdates()  
の間に、Cellの削除処理を記載します。

### Cell削除の実行

self.tableView.deleteRowsAtIndexPathsメソッドへ、削除するCellの範囲をIndexPathの配列で渡します。今回のケースでは、Cellを１つ削除するのみなので、削除先のIndexPathが１つだけ入った配列として渡します。

### Cellの数とDataSourceのアイテム数を一致させる

self.tableView.endUpdates()の時点で、Cellの数とDataSourceのアイテム数が一致しないと、エラーになるので、self.dataSource.removeAtIndexメソッドを使い、削除したCellと対応するアイテムをDataSourceから削除します。


CC BY-SA 3.0
2016-01-04T12:45:46.087
20598
2016-01-05T08:30:31.613
2020-06-17T08:14:45.997
-1
13880
20586
answer