質問: UITableViewのセルを、セル内のボタン(UIButton)を押したときに、ボタンを押したセルが削除される仕様を実装したいと考えています。 (Twitterでのフォローリクエストを拒否したときのセルが削除されるイメージ) しかし、検索しても編集モードを用いたセルの削除しかヒットせず、どうすればよいのか途方に暮れています。 編集モードを用いた方法しかヒットしないことを考えると もしかしたら、編集モードをうまく応用してセル内のボタンが押されたときに編集モードを開始して、セルを削除しているのかもしれませんが、どうすればよいのか全く見当がつきません。 なにかありましたら、随時補足させていただきますので よろしくお願い致します。
回答: 以下の3つのステップで実装できます。 ================== 1. ボタンをUITableViewControllerのサブクラスのメソッドへ紐づける 2. 押されたボタンから、ボタンの乗っているCellのIndexPathを取得 3. 取得したIndexPathを利用してCellを削除 ``` @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() } ``` IndexPath取得 =========== IndexPathの取得方法はボタンの配置によって変わるので、上記のコードで動かない場合は、変更してください。 Cellの削除処理 ========= ### 処理の記載場所 self.tableView.beginUpdates() と self.tableView.endUpdates() の間に、Cellの削除処理を記載します。 ### Cell削除の実行 self.tableView.deleteRowsAtIndexPathsメソッドへ、削除するCellの範囲をIndexPathの配列で渡します。今回のケースでは、Cellを1つ削除するのみなので、削除先のIndexPathが1つだけ入った配列として渡します。 ### Cellの数とDataSourceのアイテム数を一致させる self.tableView.endUpdates()の時点で、Cellの数とDataSourceのアイテム数が一致しないと、エラーになるので、self.dataSource.removeAtIndexメソッドを使い、削除したCellと対応するアイテムをDataSourceから削除します。