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

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

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

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

受付中

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

moris
moris

総合スコア0

Swift

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

1回答

0グッド

0クリップ

231閲覧

投稿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() } }

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答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

総合スコア6201

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Swift

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