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

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

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

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

Swift

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

Q&A

解決済

3回答

2144閲覧

Swift3 UserDefaultに配列が保存されない

Tats.N

総合スコア62

Xcode

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

Swift

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

0グッド

0クリップ

投稿2016/12/16 04:41

編集2016/12/16 04:47

こんにちは。いつもありがとうございます。

UserDefaultに配列を保存してアプリを閉じてもデータが残るようにしたいのです。
下のaddItem関数内で保存しているのですが、アプリを閉じると消えてしまいます。何を間違ってますか?
わかる方おられましたらご教授ください。宜しくお願いします。

Swift

1 2 3 var items = [[String](),[String](),[String]()] 4 5 let ud = [UserDefaults.standard,UserDefaults.standard,UserDefaults.standard] 6 7 8 @IBAction func addItem(_ sender: Any) { 9 10//略 11 12 // save into memory 13 ud[fridgeSegOutlet.selectedSegmentIndex].set(items[fridgeSegOutlet.selectedSegmentIndex], forKey: String(fridgeSegOutlet.selectedSegmentIndex)) 14 15 self.textInput.resignFirstResponder() 16 }

全体のコードです

Swift

1 2import UIKit 3 4class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 5 6 @IBOutlet var textInput: UITextField! 7 @IBOutlet var table: UITableView! 8 9 10 //var fridgeItem = [String]() // this is going to init this array so i don't need to put anything in it. 11 //var freezerItem = [String]() 12 //var otherItem = [String]() 13 var items = [[String](),[String](),[String]()] 14 //Fridge, Freezer, Other 15 16 //refered:http://cabbalog.blogspot.com/2016/09/xcode8-swift3-nsuserdefaults.html 17 let ud = [UserDefaults.standard,UserDefaults.standard,UserDefaults.standard] 18 19 @IBOutlet var fridgeSegOutlet: UISegmentedControl! 20 @IBAction func fridgeSeg(_ sender: Any) { 21 //if ud[fridgeSegOutlet.selectedSegmentIndex].object(forKey: String(fridgeSegOutlet.selectedSegmentIndex)) != nil{ 22 //items[fridgeSegOutlet.selectedSegmentIndex] = ud[fridgeSegOutlet.selectedSegmentIndex].object(forKey: String(fridgeSegOutlet.selectedSegmentIndex)) as! [String] 23 //} 24 25 26 table.reloadData() 27 } 28 29 @IBAction func addItem(_ sender: Any) { 30 // Add item to list 31 if textInput.text != "" { 32 items[fridgeSegOutlet.selectedSegmentIndex].append(textInput.text!) 33 } 34 // Clear text input field 35 textInput.text = "" 36 37 // refresh table view 38 table.reloadData() 39 40 // save into memory 41 ud[fridgeSegOutlet.selectedSegmentIndex].set(items[fridgeSegOutlet.selectedSegmentIndex], forKey: String(fridgeSegOutlet.selectedSegmentIndex)) 42 self.textInput.resignFirstResponder() 43 } 44 45 override func viewDidLoad() { 46 super.viewDidLoad() 47 if ud[fridgeSegOutlet.selectedSegmentIndex].object(forKey: String(fridgeSegOutlet.selectedSegmentIndex)) != nil{ 48 //items[fridgeSegOutlet.selectedSegmentIndex] = ud[fridgeSegOutlet.selectedSegmentIndex].object(forKey: String(fridgeSegOutlet.selectedSegmentIndex)) as! [String] 49 } 50 //for index in 0...2{ 51 // ud[index].set(items[index], forKey: String(index)) 52 //} 53 } 54 55 public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ 56 57 return items[fridgeSegOutlet.selectedSegmentIndex].count 58 } 59 60 public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 61 62 let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell") 63 64 cell.textLabel?.text = items[fridgeSegOutlet.selectedSegmentIndex][indexPath.row] 65 66 return cell 67 68 } 69 70 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 71 if editingStyle == UITableViewCellEditingStyle.delete{ 72 items[fridgeSegOutlet.selectedSegmentIndex].remove(at: indexPath.row) 73 74 table.deleteRows(at: [indexPath], with: .automatic) 75 76 ud[fridgeSegOutlet.selectedSegmentIndex].object(forKey: String(fridgeSegOutlet.selectedSegmentIndex)) 77 } 78 } 79 80 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 81 self.view.endEditing(true) 82 } 83 84 override func didReceiveMemoryWarning() { 85 super.didReceiveMemoryWarning() 86 // Dispose of any resources that can be recreated. 87 } 88 89 90} 91 92

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

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

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

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

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

guest

回答3

0

UserDefaults.standard は Singletonなので配列にしている時点で何か勘違いをされているようです。3つのセグメンテッドコントロールの状態を保存するだけなら配列で保存すれば良いと思います。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 var items:Array<Int> = [0,0,0] 6 7 let ud = UserDefaults.standard 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 ud.register(defaults: ["items":items]) 13 ud.synchronize() 14 15 print(ud.array(forKey: "items")) 16 // Optional([0, 0, 0]) 1回目 17 // Optional([0, 1, 0]) 2回目 18 19 items[1] = 1 20 ud.set(items,forKey:"items") 21 ud.synchronize() 22 23 print(ud.array(forKey: "items")) 24 // Optional([0, 1, 0]) 1回目 25 // Optional([0, 1, 0]) 2回目 26 27 } 28 29} 30

Dictionaryでいくならこんな感じ

swift

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 var items:Dictionary<String,Any> = ["seg1":0,"seg2":0,"seg3":0] 7 8 let ud = UserDefaults.standard 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 ud.register(defaults: ["items":items]) 14 ud.synchronize() 15 16 print(ud.dictionary(forKey: "items")) 17 // Optional(["seg3": 0, "seg2": 0, "seg1": 0]) 1回目 18 // Optional(["seg3": 0, "seg2": 1, "seg1": 0]) 2回目 19 20 items["seg2"] = 1 21 ud.set(items,forKey: "items") 22 ud.synchronize() 23 24 print(ud.dictionary(forKey: "items")) 25 // Optional(["seg3": 0, "seg2": 1, "seg1": 0]) 1回目 26 // Optional(["seg3": 0, "seg2": 1, "seg1": 0]) 2回目 27 28 } 29 30}

投稿2016/12/17 09:48

編集2016/12/17 09:51
fromageblanc

総合スコア2724

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

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

0

ベストアンサー

保存したデータを読み込んでいないようにみえるのですが?

投稿2016/12/16 05:33

fuzzball

総合スコア16731

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

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

Tats.N

2016/12/31 00:31

超凡ミスでした。。ありがとうございます。
guest

0

下記を追加するとどうでしょうか?

ud.synchronize()

投稿2016/12/16 04:58

apple_japan

総合スコア57

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

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

Tats.N

2016/12/16 05:14

// save into memory ud[fridgeSegOutlet.selectedSegmentIndex].set(items[fridgeSegOutlet.selectedSegmentIndex], forKey: "\(fridgeSegOutlet.selectedSegmentIndex)") ud[fridgeSegOutlet.selectedSegmentIndex].synchronize() このようにして見ましたが、やはり保存されてなかったです。。
apple_japan

2016/12/16 05:28 編集

var items = [[String](),[String](),[String]()] let ud = [UserDefaults.standard,UserDefaults.standard,UserDefaults.standard] @IBAction func addItem(_ sender: Any) { //略 // save into memory ud[fridgeSegOutlet.selectedSegmentIndex].set(items[fridgeSegOutlet.selectedSegmentIndex], forKey: String(fridgeSegOutlet.selectedSegmentIndex)) ud[fridgeSegOutlet.selectedSegmentIndex].synchronize() self.textInput.resignFirstResponder() } でどうですか?
kra8

2016/12/16 09:35

`ud.synchronize()`の戻り値がtrueになっていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問