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

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

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

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

Q&A

解決済

2回答

593閲覧

[swift4]Cellを削除してから前の画面に戻ると削除したはずのCellが復活している。

Kaguya_4869

総合スコア116

Swift

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

0グッド

0クリップ

投稿2019/07/26 02:28

#質問したいこと
Todoリストで追加したものをスワイプで消す→前の画面に戻る→もう一度Todoリストの画面に戻る→消したはずのcellが復活している
#コード

swift

1import UIKit 2 3//classの継承を追加 4class ViewController: UIViewController{ 5 6 //テキストフィールドの設定 7 @IBOutlet weak var TodoTextField: UITextField! 8 9 @IBOutlet weak var tableView: UITableView! 10 11 // アイテムの型 12 class Item { 13 var title : String 14 var done: Bool = false 15 16 init(title: String) { 17 self.title = title 18 } 19 } 20 // この配列に作ったアイテムを追加していく 21 var itemArray: [Item] = [] 22 23 var todoKobetsunonakami = [String]() 24 25 //最初からあるコード 26 override func viewDidLoad() { 27 super.viewDidLoad() 28 29 //追加画面で入力した内容を取得する 30 if UserDefaults.standard.object(forKey: "TodoList") != nil { 31 todoKobetsunonakami = UserDefaults.standard.object(forKey: "TodoList") as! [String] 32 } 33 34 35 if let todos = UserDefaults.standard.object(forKey: "TodoList") as? [String] { 36 todoKobetsunonakami = todos 37 } 38 } 39 40 //最初からあるコード 41 override func didReceiveMemoryWarning() { 42 super.didReceiveMemoryWarning() 43 } 44 45 //追加ボタンの設定 46 @IBAction func TodoAddButten(_ sender: Any) { 47 //変数に入力内容を入れる 48 todoKobetsunonakami.append("Todo(todoKobetsunonakami.count)") 49 50 //追加ボタンを押したらフィールドを空にする 51 TodoTextField.text = "" 52 53 //変数の中身をUDに追加 54 UserDefaults.standard.set(todoKobetsunonakami, forKey: "TodoList" ) 55 56 57 tableView.reloadData() 58 } 59} 60 61extension ViewController: UITableViewDelegate, UITableViewDataSource { 62 63 //UITableView、numberOfRowsInSectionの追加(表示するcell数を決める) 64 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 65 //戻り値の設定(表示するcell数) 66 return todoKobetsunonakami.count 67 } 68 69 //UITableView、cellForRowAtの追加(表示するcellの中身を決める) 70 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 71 //変数を作る 72 let TodoCell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "TodoCell", for: indexPath) 73 //変数の中身を作る 74 TodoCell.textLabel?.text = todoKobetsunonakami[indexPath.row] 75 //戻り値の設定(表示する中身) 76 return TodoCell 77 } 78 79 //セルの編集許可 80 func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 81 return true 82 } 83 84 //スワイプしたセルを削除 85 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 86 if editingStyle == UITableViewCell.EditingStyle.delete { 87 88 //itemArray.remove(at: indexPath.row) 89 todoKobetsunonakami.remove(at: indexPath.row) 90 tableView.deleteRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic) 91 } 92 } 93}

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

Todoを消したときも

UserDefaults.standard.set(todoKobetsunonakami, forKey: "TodoList" )

のように保存をしてください。

投稿2019/07/26 02:31

takabosoft

総合スコア8356

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

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

0

ベストアンサー

削除した後の保存がないからですね。
セルの削除の部分に以下を追加してください。
ちゃんと確認していなくて申し訳ありませんが、これでできると思います。

//スワイプしたセルを削除 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == UITableViewCell.EditingStyle.delete { //itemArray.remove(at: indexPath.row) todoKobetsunonakami.remove(at: indexPath.row) // todokebetsunonakamiが更新されたので保存 UserDefaults.standard.set(todoKobetsunonakami, forKey: "TodoList" ) tableView.deleteRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic) } }

あとUserDefaultsから読み込みの処理が二重になっているので片方消してください。

Swift

1//最初からあるコード 2 override func viewDidLoad() { 3 super.viewDidLoad() 4 5 //追加画面で入力した内容を取得する 6 if let todos = UserDefaults.standard.object(forKey: "TodoList") as? [String] { 7 todoKobetsunonakami = todos 8 } 9 }

投稿2019/07/26 02:41

hayabusabusash

総合スコア767

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

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

Kaguya_4869

2019/07/26 09:01

ありがとうございます! できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問