質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.11%

tableviewのcellに設置したボタンを押してcellを削除する際

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 642

po_tato

score 58

cellの削除の方法が知りたくて、
http://qiita.com/The_Shimon/items/7f93e82b0a043008e227
こちらのサイトを参考にさせていただき、私の場合はcellの上にボタンを配置して
それを押すとcellが削除できるという実装をしました。
ボタンのaction部分が以下です。

@IBAction func deletecell(_ sender: UIButton) {

    let alertController = UIAlertController(title: "", message:"削除しますか?", preferredStyle: UIAlertControllerStyle.alert)
    let actionOK:UIAlertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default
        ,handler:{
            (action:UIAlertAction!) -> Void in
            print("OK")
            let cell = sender.superview?.superview as? UITableViewCell
            let indexPath = self.table.indexPath( for: cell! )

            self.table.beginUpdates()
            self.image.remove(at: (indexPath?.row)!)
            self.table.deleteRows(at: [indexPath!], with: .fade)
            self.table.endUpdates()

    })

    let cancelAction:UIAlertAction = UIAlertAction(title: "Cancel",style: UIAlertActionStyle.cancel,
                                                   handler:{
                                                    (action:UIAlertAction!) -> Void in
                                                    print("Cancel")
    })
    // addActionした順に左から右にボタンが配置されます
    alertController.addAction(actionOK)
    alertController.addAction(cancelAction)
    self.present(alertController, animated: true, completion: nil)

}


そしてcellに表示させているものはUIImage型のimageです。
このimageの数はサーバーから取得してくるので動的ですが、
今回はUIImage型の配列に5つの情報が入っているものとします。
私は、削除したものは次回以降表示させたくありませんが、
table.reloadや再度ページを表示した際にまた5つ表示されてしまいます。userdefaultなどで削除したものを記憶しておいて、
それを除けばいいのかもしれませんが、いまいちやり方が分かりません。

また、userdefaultはUIImage型を保存できず、
NSData型に変換しなければならないやら、それはお勧めできないやら、
やり方がわかりません。何か少しでも知っている方がいたら、
考え方など教えていただけたら幸いでございます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Stripe

    2017/08/28 10:50

    サーバから取得される個々のデータにタイムスタンプかユニークな識別子はありますか? それがないとメールのようなデータ管理はできません。

    キャンセル

  • po_tato

    2017/08/28 11:21

    ないので修正しないといけないですね、サーバー側の情報を。もし、仮に個々を判別できるユニークな値(1とか2とか)を設定出来たとしたらその値をUserDefaultに保存するのですか?

    キャンセル

  • Stripe

    2017/08/28 20:10

    UserDefaultには保存しません。UserDefaultはそのような用途では使用しません。普通にファイルに、というかとあるディレクトリにファイルを保存する形になると思います。メールアプリはメールを全部ダウンロードしてきてローカルに保管しますから。

    キャンセル

回答 1

+1

元データを削除しないと、reloadすれば復活するのは当たり前の話です。

beginUpdates~endUpdatesを使ってセルそのものを削除するのではなく、セル生成の元になるデータ(例えば何らかのArrayなど)からデータを削除してテーブルをreloadすればいいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/25 17:45

    おっしゃる通り、
    self.image.remove(at: (indexPath?.row)!)
    self.table.reloadData()
    だけで同じ動きになりました。

    一応、print(self.image)して削除ボタン押すたびに配列から一つずつ排除されていくのをログで確認しております。

    キャンセル

  • 2017/08/25 18:17 編集

    removeされているのにセルが表示されるのであれば、tableView(_:cellForRowAt:)の実装がおかしいということになりますが‥。

    ちなみに「削除したものは次回以降表示させたくありません」というのは、例えばアプリを再起動したときしたときなども含めてのことでしょうか?もしそうでもしそうであれば、UserDefaultsなどを使わないとダメですね。(保存するにしても、保存するのは画像データではなく、サーバから画像を取得するためのIDなどです)

    キャンセル

  • 2017/08/25 18:22

    はいそうです。やはりUserDefaultですよね。そうですかー難しいですね。。
    もう少し考えてみます。。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る