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

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

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

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

Q&A

解決済

1回答

688閲覧

Swiftの構造体から特定の行を削除したい

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2022/03/25 05:42

編集2022/03/25 07:42

前提

構造体を使用してデータを管理しています。

実現したいこと

セルをスワイプして構造体データの中から特定の行を削除したいです

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

Thread 1: "Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (99) must be equal to the number of rows contained in that section before the update (99), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out)."
スレッド1:「無効な更新:セクション0の行数が無効です。更新後の既存のセクションに含まれる行数(99)は、更新前のそのセクションに含まれる行数(99)に加えて、または、そのセクションに挿入または削除された行数(0が挿入、1が削除)、およびプラスまたはマイナスがそのセクションに移動または削除された行数(0が移動、0が移動)。」

該当のソースコード

Swift

1// 構造体 2struct User: Codable { 3 let name: String 4 let url: String 5 let profile_image_url: String 6 } 7 8// MARK: - UITableview 9 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 10 return List.count 11 } 12 13 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 14 15 let cell = tableView.dequeueReusableCell(withIdentifier: "EditTableViewCell", for: indexPath) as! EditTableViewCell 16 17 // self.List = getValue() 18 19 cell.idLabel.text = "\(indexPath.row + 1)" 20 cell.titleLabel.text = List[indexPath.row].name 21 cell.name.text = List[indexPath.row].url 22 23 let urlString = List[indexPath.row].profile_image_url 24 Nuke.loadImage(with: URL(string: urlString)!, into: cell.userImage) 25 26 return cell 27 } 28 29 // 高さ 30 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{ 31 return 72 32 } 33 34 // 空のテーブル表示用 35 func title(forEmptyDataSet scrollView: UIScrollView!) -> NSAttributedString! { 36 return NSAttributedString(string: "データがありません") 37 } 38 39 // タップ 40 /* 省略 */ 41 42 // セルの削除 43 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 44 45 List.remove(at: indexPath.row) 46 tableView.deleteRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic) 47 // 追加:削除した内容を保存 48 let encoder = JSONEncoder() 49 if let encodedValue = try? encoder.encode(self.List) { 50 UserDefaults.standard.set(encodedValue, forKey: "List") 51 self.save() 52 print("削除なう") 53 print(self.List.count) 54 } 55 } 56 57// MARK: - Functions 58 private func getValue() -> [User] { 59 guard let data = UserDefaults.standard.data(forKey: "List") else { 60 return [] 61 } 62 return decoded(data: data) 63 } 64 65 private func decoded(data: Data) -> [User] { 66 do { 67 let jsonDecoder = JSONDecoder() 68 let followes = try jsonDecoder.decode([User].self, from: data) 69 return followes 70 } catch { 71 return [] 72 } 73 } 74 75private func save() { 76 guard let data = encoded() else { return } 77 UserDefaults.standard.setValue(data, forKey: "TwitterUserList") 78 print("保存完了しました") 79 } 80 81 private func encoded() -> Data? { 82 do { 83 let encoder = JSONEncoder() 84 let data = try encoder.encode(self.userList) 85 return data 86 } catch { 87 return nil 88 } 89 } 90

試したこと

・swift4 - スワイプでtableviewのセル削除
https://qiita.com/Lulu34/items/b0c88d1e1163d50f743b

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

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

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

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

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

hoshi-takanori

2022/03/25 06:18

List と userList という 2 つの変数を使ってるせいでは…。
退会済みユーザー

退会済みユーザー

2022/03/25 06:42

元のコードがuserListで質問するにあたってListに置換しました。 一部漏れがあったので全てListに修正し直しました。 よろしくお願いいたします。
hoshi-takanori

2022/03/25 07:41 編集

それで動くことは動くはずですけど…。データを保存する処理がメソッド化されてないのが気になりますが、もしかして追加の際に保存を忘れてるとか? なお、変数名は userList の方が良いですし、cellForRowAt の中で List を書き換える (同じ値になるはずとはいえ) のは握手です。
退会済みユーザー

退会済みユーザー

2022/03/25 07:44

> それで動くことは動くはずですけど…。データを保存する処理がメソッド化されてないのが気になりますが、もしかして追加の際に保存を忘れてるとか? こちらも修正しました。 (save関連を一度外してデバッグしてました。元に戻しました) 現在このバージョンでも削除すると落ちてしまいます、、
退会済みユーザー

退会済みユーザー

2022/03/25 07:48

まさかの直りましたm(_ _)m cellForRowAt内の 『self.List = getValue()』が余計でした。 大変失礼しましたm(_ _)m
guest

回答1

0

ベストアンサー

余計なコードがあったので削除しました。

Swift

1// 構造体 2struct User: Codable { 3 let name: String 4 let url: String 5 let profile_image_url: String 6 } 7 8// MARK: - UITableview 9 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 10 return List.count 11 } 12 13 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 14 15 let cell = tableView.dequeueReusableCell(withIdentifier: "EditTableViewCell", for: indexPath) as! EditTableViewCell 16 17 cell.idLabel.text = "\(indexPath.row + 1)" 18 cell.titleLabel.text = List[indexPath.row].name 19 cell.name.text = List[indexPath.row].url 20 21 let urlString = List[indexPath.row].profile_image_url 22 Nuke.loadImage(with: URL(string: urlString)!, into: cell.userImage) 23 24 return cell 25 } 26 27 // 高さ 28 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{ 29 return 72 30 } 31 32 // 空のテーブル表示用 33 func title(forEmptyDataSet scrollView: UIScrollView!) -> NSAttributedString! { 34 return NSAttributedString(string: "データがありません") 35 } 36 37 // セルの削除 38 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 39 40 List.remove(at: indexPath.row) 41 tableView.deleteRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic) 42 // 追加:削除した内容を保存 43 let encoder = JSONEncoder() 44 if let encodedValue = try? encoder.encode(self.List) { 45 UserDefaults.standard.set(encodedValue, forKey: "List") 46 self.save() 47 print("削除なう") 48 print(self.List.count) 49 } 50 } 51 52// MARK: - Functions 53 private func getValue() -> [User] { 54 guard let data = UserDefaults.standard.data(forKey: "List") else { 55 return [] 56 } 57 return decoded(data: data) 58 } 59 60 private func decoded(data: Data) -> [User] { 61 do { 62 let jsonDecoder = JSONDecoder() 63 let followes = try jsonDecoder.decode([User].self, from: data) 64 return followes 65 } catch { 66 return [] 67 } 68 } 69 70private func save() { 71 guard let data = encoded() else { return } 72 UserDefaults.standard.setValue(data, forKey: "TwitterUserList") 73 print("保存完了しました") 74 } 75 76 private func encoded() -> Data? { 77 do { 78 let encoder = JSONEncoder() 79 let data = try encoder.encode(self.userList) 80 return data 81 } catch { 82 return nil 83 } 84 } 85 86

投稿2022/03/25 07:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問