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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

897閲覧

所得した値をタプル型で配列に保存しているが、配列がリセットされてしまう

lilybelly

総合スコア19

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/02/06 09:31

##概要
簡単なメモアプリを作成しています。
5つの入力する欄からユーザーが入力すると、タプルでデータを保存するようにしています。
そして保存したデータからテーブルを作成したいです。

##できないこと
ユーザーが入力した値を取得して配列に追加で保存しているつもりなんですが、
配列には常に1つしか保存されません。
なにが問題なのかわからないので指摘していただきたいです。
入力画面に戻ると一度配列の中身がリセットされてしまっているのでしょうか?

swift4

1import UIKit 2 3 4class ViewController: UIViewController, UITextFieldDelegate,UITextViewDelegate { 5 6 @IBOutlet var titleField: UITextField! 7 @IBOutlet var memoTextView: UITextView! 8 @IBOutlet var memoNumLabel: UILabel! 9 @IBOutlet var companyField: UITextField! 10 @IBOutlet var dateField: UITextField! 11 12 // 保存用の変数 13 var titleStr: String? = "" 14 var memoText: String? = "" 15 var company: String? = "" 16 var memoNum = "" 17 var memoDate: String? = "" 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 titleField.delegate = self 22 memoTextView.delegate = self 23 24 } 25 26 @IBAction func saveData(_ sender: Any) { 27 //タプルでメモリストを作成 28 var memoList:[(title:String ,company:String, memoText:String, memoNum:String, memoDate:String)] = [] 29 30 //ユーザーが入力した値をタプルの配列に格納 31 titleStr = self.titleField.text! 32 memoText = self.memoTextView.text! 33 memoNum = self.memoNumLabel.text! 34 company = self.companyField.text! 35 memoDate = self.dateField.text! 36 37 //ユーザーの入力値をuserMemoとして設定 38 let userMemo = (title:titleStr ,company:company, memoText: memoText, memoNum:memoNum, memoDate:memoDate) 39 40 //ユーザーが入力した値を配列に追加 41 memoList.append(userMemo as! (title: String, company: String, memoText: String, memoNum: String, memoDate: String)) 42 print(memoList) 43 44 // タプルの配列を辞書の配列へ変換 45 var saveMemo:[[String: Any]] = memoList.map{["title": $0.title, "company": $0.company, "memoText": $0.memoText, "memoNum": $0.memoNum, "memoDate":$0.memoDate]} 46 47 UserDefaults.standard.set(saveMemo, forKey: "memoList") 48 49 self.navigationController?.popViewController(animated: true) 50 51 func didReceiveMemoryWarning() { 52 super.didReceiveMemoryWarning() 53 } 54 }

swift4

1~~省略  2import UIKit 3import SnapKit 4 5 6class MemoTableViewController: UITableViewController, UINavigationControllerDelegate { 7 8 9 var memoResult :[(title:String ,company:String, memoText:String, memoNum:String, memoDate:String)] = [] 10 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 //取り出す時 16 17 if let loadMemo = UserDefaults.standard.object(forKey: "memoList") as? [[String: Any]] { 18 let memoList2 = loadMemo.map { (title: $0["title"] as! String, company: $0["company"] as! String, memoText: $0["memoText"] as! String, memoNum: $0["memoNum"] as! String, memoDate: $0["title"] as! String) } 19 memoResult = memoList2 20 } 21 22 tableView.reloadData() 23 } 24 25 override func viewWillAppear(_ animated: Bool) { 26 super.viewWillAppear(animated) 27 28 if let loadMemo = UserDefaults.standard.object(forKey: "memoList") as? [[String: Any]] { 29 let memoList2 = loadMemo.map { (title: $0["title"] as! String, company: $0["company"] as! String, memoText: $0["memoText"] as! String, memoNum: $0["memoNum"] as! String, memoDate: $0["title"] as! String) } 30// print(memoList2) 31 memoResult = memoList2 32 } 33 //配列が追加した後もういちどデータをリロードさせる 34 tableView.reloadData() 35 36 } 37 38 override func viewWillAppear(_ animated: Bool) { 39 super.viewWillAppear(animated) 40 41 if let loadMemo = UserDefaults.standard.object(forKey: "memoList") as? [[String: Any]] { 42 let memoList2 = loadMemo.map { (title: $0["title"] as! String, company: $0["company"] as! String, memoText: $0["memoText"] as! String, memoNum: $0["memoNum"] as! String, memoDate: $0["title"] as! String) } 43 print(memoList2) 44 memoResult = memoList2 45 } 46 //配列が追加した後もういちどデータをリロードさせる 47 tableView.reloadData() 48 49 } 50 //セクションの数 51 override func numberOfSections(in tableView: UITableView) -> Int { 52 return 1 53 } 54 //何行か 55 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 56 return memoResult.count 57 } 58 59 //セルの作成 rowは何行目か 60 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 61 let cell = tableView.dequeueReusableCell(withIdentifier: "MemoTitleTableViewCell", for: indexPath) 62 cell.textLabel?.text = self.memoResult[indexPath.row].title 63 cell.detailTextLabel?.text = self.memoResult[indexPath.row].memoNum 64 65 return cell 66 } 67 68 //セクション名 69 override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 70 71 return "category-(section)" 72 } 73 74 75 //セルの削除 76 override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 77 if editingStyle == .delete { 78 // 特定の行をremoveで消す 79 memoResult.remove(at: indexPath.row) 80 // 保存しているタイトルの配列を改めてセット 81 UserDefaults.standard.set(memoResult, forKey: "memoList") 82 tableView.reloadData() 83 } 84 } 85 86~~省略

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

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

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

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

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

guest

回答1

0

自己解決

コードに現在の配列を呼びだすコードを追加して
修正できました

//現在の配列を取り出す if let loadMemo = UserDefaults.standard.object(forKey: "memoList") as? [[String: Any]] { let memoList2 = loadMemo.map { (title: $0["title"] as! String, company: $0["company"] as! String, memoText: $0["memoText"] as! String, memoNum: $0["memoNum"] as! String, memoDate: $0["title"] as! String) } // print(memoList2) memoList = memoList2 }

投稿2019/02/06 10:08

lilybelly

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問