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

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

ただいまの
回答率

89.65%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 183

lilybelly

score 13

概要

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

できないこと

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

import UIKit


class ViewController: UIViewController, UITextFieldDelegate,UITextViewDelegate {

    @IBOutlet var titleField: UITextField!
    @IBOutlet var memoTextView: UITextView!
    @IBOutlet var memoNumLabel: UILabel!
    @IBOutlet var companyField: UITextField!
    @IBOutlet var dateField: UITextField!

    // 保存用の変数
    var titleStr: String? = ""
    var memoText: String? = ""
    var company: String? = ""
    var memoNum = ""
    var memoDate: String? = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        titleField.delegate = self
        memoTextView.delegate =  self

    }

    @IBAction func saveData(_ sender: Any) {
        //タプルでメモリストを作成
        var memoList:[(title:String ,company:String, memoText:String, memoNum:String, memoDate:String)] = []

        //ユーザーが入力した値をタプルの配列に格納
        titleStr = self.titleField.text!
        memoText = self.memoTextView.text!
        memoNum = self.memoNumLabel.text!
        company = self.companyField.text!
        memoDate = self.dateField.text!

        //ユーザーの入力値をuserMemoとして設定
        let userMemo = (title:titleStr ,company:company, memoText: memoText, memoNum:memoNum, memoDate:memoDate)

        //ユーザーが入力した値を配列に追加
        memoList.append(userMemo as! (title: String, company: String, memoText: String, memoNum: String, memoDate: String))
        print(memoList)

        //  タプルの配列を辞書の配列へ変換
        var saveMemo:[[String: Any]] = memoList.map{["title": $0.title, "company": $0.company, "memoText": $0.memoText, "memoNum": $0.memoNum, "memoDate":$0.memoDate]}

        UserDefaults.standard.set(saveMemo, forKey: "memoList")

        self.navigationController?.popViewController(animated: true)

        func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        }
    }
~~省略 
import UIKit
import SnapKit


class MemoTableViewController: UITableViewController, UINavigationControllerDelegate {


    var memoResult :[(title:String ,company:String, memoText:String, memoNum:String, memoDate:String)] = []


    override func viewDidLoad() {
        super.viewDidLoad()

        //取り出す時

        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) }
            memoResult = memoList2
        }

        tableView.reloadData()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        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)
            memoResult = memoList2
        }
        //配列が追加した後もういちどデータをリロードさせる
        tableView.reloadData()

    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        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)
            memoResult = memoList2
        }
        //配列が追加した後もういちどデータをリロードさせる
        tableView.reloadData()

    }
    //セクションの数
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    //何行か
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return memoResult.count
    }

    //セルの作成 rowは何行目か
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MemoTitleTableViewCell", for: indexPath)
        cell.textLabel?.text = self.memoResult[indexPath.row].title
        cell.detailTextLabel?.text = self.memoResult[indexPath.row].memoNum

        return cell
    }

    //セクション名
    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

        return "category-\(section)"
    }


    //セルの削除
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
         if editingStyle == .delete {
    //        特定の行をremoveで消す
            memoResult.remove(at: indexPath.row)
    //        保存しているタイトルの配列を改めてセット
            UserDefaults.standard.set(memoResult, forKey: "memoList")
            tableView.reloadData()
         }
    }

~~省略
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

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
        }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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