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

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

新規登録して質問してみよう
ただいま回答率
85.48%
TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

button

HTMLで用いる<button>タグです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

3296閲覧

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

po_tato

総合スコア97

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

button

HTMLで用いる<button>タグです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/08/25 07:18

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型に変換しなければならないやら、それはお勧めできないやら、
やり方がわかりません。何か少しでも知っている方がいたら、
考え方など教えていただけたら幸いでございます。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2017/08/27 14:29

ようするに、メールアプリと同じ様なことがしたい、という事ですか?
po_tato

2017/08/28 00:27

はい。そうでございます。
Stripe

2017/08/28 01:50

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

2017/08/28 02:21

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

2017/08/28 11:10

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

回答1

0

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

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

投稿2017/08/25 07:58

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

po_tato

2017/08/25 08:21

生成の元になるデータはこの場合ですとサーバーに登録してある情報ということになりますよね?その場合どのように削除するのかがわかりません。
fuzzball

2017/08/25 08:28

セルを生成するときにサーバのデータを直接参照しているわけではなく、一旦Arrayなどに入れたデータを使っているでしょ?
po_tato

2017/08/25 08:30

はい、その通りです。この場合ですと、imageがそれに当たりますが、コードではcellを削除する前にimageもremoveしていますよ?
fuzzball

2017/08/25 08:35

それなら、 self.image.remove(at: (indexPath?.row)!) self.table.reloadData() だけでいけるはずですが。 正常にremoveされていることは確認しましたか?
po_tato

2017/08/25 08:45

おっしゃる通り、 self.image.remove(at: (indexPath?.row)!) self.table.reloadData() だけで同じ動きになりました。 一応、print(self.image)して削除ボタン押すたびに配列から一つずつ排除されていくのをログで確認しております。
fuzzball

2017/08/25 09:18 編集

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

2017/08/25 09:22

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問