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

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

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

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

3回答

5077閲覧

NSUserDefaultsが保存されない

yukitoto

総合スコア53

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

1クリップ

投稿2016/05/31 11:33

はじめまして、質問をご覧頂いてありがとうございます。
現在、iOS8・Xcode7.3、swift2という環境でStoryBoardを利用せずにiOSアプリの開発を行っています。
今回の質問のゴールとしては、NSUserDefaultsを利用してユーザーの設定情報を保持する、ということなのですが、なぜか上手く保存されません。
synchronize()を利用しているにも関わらず保存されません。
たまに保存されるのですが、再度Runするとデータが消えてしまっています。
何卒お力をお貸し下さい。

swift

1 let ud = NSUserDefaults.standardUserDefaults() 2 ud.setObject("21", forKey: "currentUserId") 3 ud.synchronize() 4 5 let currentUserId = ud.integerForKey("currentUserId")// => 0が返ってくる

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

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

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

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

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

guest

回答3

0

NSUserDefaultsは保存する内容によってメソッドが違うので注意してください。
そして入れる時と出す時のメソッドは揃えてくださいね。

以下参考URL
データ保存

swift

1// Objectに合わせる場合 2let ud = NSUserDefaults.standardUserDefaults() 3ud.setObject("21", forKey: "currentUserId") 4ud.synchronize() 5 6let currentUserId = ud.objectForKey("currentUserId") 7 8 9// NSIntegerに合わせる場合 10let ud = NSUserDefaults.standardUserDefaults() 11ud.setInteger(21, forKey: "currentUserId") 12ud.synchronize() 13 14let currentUserId = ud.integerForKey("currentUserId")

投稿2016/05/31 12:21

編集2016/05/31 12:22
_Kentarou

総合スコア8490

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

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

yukitoto

2016/05/31 12:46

ご回答ありがとうございます!! そうだったのですね、無知すぎました... ただそれでも0が返ってきてしまいました... ```swift ud.setInteger(21, forKey: "currentUserId") ud.synchronize() let currentUserId = ud.integerForKey("currentUserId") ```
_Kentarou

2016/05/31 12:59

こちらでは正常に動くので間違えてはいないようですね。 新規プロジェクトにコピペしても同じ様な状態になりますか?
guest

0

関係なさそうですが一応共有します。
iOS9.3.x では NSUserDefault が保存されないバグが存在するようです。
iOS8 との情報をいただいていますが、何かのタイミングで iOS9.3.x も
使っていなかったかご確認ください。

投稿2016/06/03 08:08

編集2016/06/03 08:17
taiju59

総合スコア54

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

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

0

ベストアンサー

「0が返ってくる」というのはどのようにして確認したのでしょうか?

もし、Playgroundで確認しているのであれば、これを読んで下さい。
Playground で NSUserDefaultsの使用

作成中のアプリの中で確認しているのであれば、確認方法を教えて下さい。

検証

環境

iPhone 5, iOS 8.4.1, Xcode 7.3.1

検証コード

swift

1func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 2 3 let ud = NSUserDefaults.standardUserDefaults() 4 print("before:", ud.integerForKey("currentUserId")) 5 6 ud.setObject("21", forKey: "currentUserId") 7 ud.synchronize() 8 9 let currentUserId = ud.integerForKey("currentUserId")// => 0が返ってくる 10 print("after:", currentUserId) 11 12 return true 13}

質問のコードそのままで、書き込み前にもprintするようにしています。

初回起動時

before: 0 after: 21

2回目以降

before: 21 after: 21

投稿2016/06/01 05:36

編集2016/06/01 23:49
fuzzball

総合スコア16731

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

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

yukitoto

2016/06/01 13:53 編集

AppDelegateの didFinishLaunchingWithOptions の項目で上記を実行し、print(currentUserId)といった形で確認しております。
fuzzball

2016/06/01 15:38

シミュレータでも同じ結果でしょうか?端末の故障は考えられないでしょうか?
fuzzball

2016/06/01 23:49

検証結果を追記しました。参考にして下さい。(↑の質問への回答もお願いします)
yukitoto

2016/06/03 07:36

> シミュレータでも同じ結果でしょうか?端末の故障は考えられないでしょうか? シミュレーターで実行していました。ずっと悩まされていたのですが、たまにしっかりと保存されるので構わずに開発をしていたら治りました... なんだったのかよくわからないのですが、丁寧な検証、心から感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問