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

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

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

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

Q&A

1回答

853閲覧

tableViewのcellをスワイプで削除したい

moris

総合スコア0

Swift

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

0グッド

0クリップ

投稿2022/10/21 15:56

編集2022/10/21 16:00

前提

XcodeでtTodoアプリをrealmを使ってアプリを作っていますが、
tableViewのcellをスワイプして削除したいがエラーが発生した

実現したいこと

スワイプして左あるいは削除を押すとcellを消えるようにしたい

発生している問題・エラーメッセージ

"Invalid update: invalid number of rows in section 0.

該当のソースコード

Xcode

1 override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 2 if editingStyle == .delete { 3 try! realm.write { 4 tableView.deleteRows(at: [indexPath], with: .fade) 5 realm.delete(itemList[indexPath.row]) 6 tableView.reloadData() 7 } 8 tableView.reloadData() 9 } 10 11 }

試したこと

ネットで検索をしたのですが、tableViewをリロードしてくださいとあり
解決しておられましたが、同じようにtableView.reloadData()を記述していますが、
エラーが解消されません

補足情報(FW/ツールのバージョンなど)

Xcode Version 14.0.1 (14A400)

ここにより詳細な情報を記載してください。

import UIKit import RealmSwift class ItemTableViewController: UITableViewController { let realm = try! Realm() let item = TodoItem() var itemList: Results<TodoItem>! var token: NotificationToken! override func viewDidLoad() { super.viewDidLoad() tableView.register(UINib(nibName: "ItemTableViewCell", bundle: nil), forCellReuseIdentifier: "checkListCell") itemList = realm.objects(TodoItem.self).sorted(byKeyPath: "name") token = realm.observe{notification,realm in self.tableView.reloadData() } } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return itemList.count } override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { try! realm.write { tableView.deleteRows(at: [indexPath], with: .fade) realm.delete(itemList[indexPath.row]) tableView.reloadData() } tableView.reloadData() } } override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 80 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "checkListCell", for: indexPath) as! ItemTableViewCell let item = itemList[indexPath.row] if item.done == false { cell.checkImageView?.image = UIImage(named: "Image") }else{ cell.checkImageView.image = UIImage(named: "check") } cell.nameLabel.text = item.name return cell } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ if let item = itemList?[indexPath.row] { do { try! realm.write { item.done = !item.done } } } tableView.reloadData() } }

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

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

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

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

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

guest

回答1

0

そのエラーが発生する原因は

swift

1tableView.deleteRows(at: [indexPath], with: .fade) 2realm.delete(itemList[indexPath.row])

の実行順序が逆だからだと思います。
relam.delete でitemListのデータを削除してから tableView.deleteRows で削除結果を画面に反映する必要があります。
正しい順序は

swift

1realm.delete(itemList[indexPath.row]) 2tableView.deleteRows(at: [indexPath], with: .fade)

です。

tableView.deleteRows を実施するなら tableView.reloadData() は不要だと思います。

投稿2022/10/21 23:51

TakeOne

総合スコア6299

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問