- ベストアンサー
Swiftでroot.plistの値が読めない
- 現在iOSアプリの開発を行っています。本体標準の設定アプリ内の各アプリの設定(SettingsBundle)でユーザーが設定した値を、アプリ内で使用したいと思っています。しかし、設定画面を開かないと値を取得できないという問題があります。
- 試しにコーディングしてみたプロジェクトでは、うまく動作しなかったため、新しいプロジェクトを作成して試してみました。すると、新しいプロジェクトでは設定アプリの設定通りに値が取得できました。
- この二つのコードの違いや、何が原因で値が取得できないのかがわからないので、質問させていただきました。お知恵を拝借できれば幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 「SettingBundleのIdentifierが"tweetTemplate_preference"となっている項目から値を取得し、自クラスのtweetTemplateという属性に代入される。もしも一度も設定していなければ、問答無用でtweetTemplateに"default"が代入される。」という認識なのですが、間違ってますでしょうか…? 合っていると思います。 > これをコーディングしていたプロジェクトではうまく動作せず、設定後も"default"が代入されてしまいました。 まず気になったのは、 コーディングに書かれている「tweetTemplate_preference」という名前と、 root.plist内に定義したidが一致していますよね? という点です。 root.plist内をどのように設定しているのか質問に全く書かれていないので まずはこれが気になりました。 次に気になったのは、そのコードがどこに書かれているかと、テストの仕方です。 もしかして、次のような手順でテストしていませんか? (1)アプリを起動する。 この時、質問のコードが実行され、 「tweetTemplate_preference」の読み込み結果がnilだったので tweetTemplateプロパティに"default"が設定される。 (2)ホームボタンをクリックし、ホーム画面に戻ってから 設定アプリを起動し、「tweetTemplate_preference」の項目を 設定する。 (3)ホーム画面経由で再度アプリに戻る。 →アプリは、起動したままサスペンド状態から戻ってきた だけですから、このままではtweetTemplateプロパティは 変化しませんよね。 この後、質問のコードが再実行されれば、tweetTemplateプロパティ は変化すると思います。 サスペンド状態から戻ってきたときに、質問のコードを自動的に再実行するには、 https://sites.google.com/site/propicaudio/sample-code/settings-bundle-test の「サスペンドから復帰したときにコールされるメソッドの指定」に 解説されているような方法でやればよいです。 解決しない場合、これらの気になった点が どうなっているか補足してもらえば、 さらに何か気付くことがあるかもしれません。 それと、今回の問題とは別の話ですが、 http://www.gadgety.net/shin/tips/mac/ios_userdefault.html に書かれているようにregisterDefaultsメソッドを使ってデフォルト値を 登録しておけば、値が設定されていない時はnilでなくデフォルト値が 返却されるようになるので、少しはコーディングが楽になると思います。
その他の回答 (1)
- Lchan0211b
- ベストアンサー率61% (573/930)
No.1です。 > …もしかしてこれが良くないのかなとも思いましたが、テストは設定アプリで設定値を変えた場合、毎回アプリケーションを停止させ起動し直しているので、コードは再実行されているものだと思われます。 「思われます」とのことですが、実際にコードが再実行されているかどうか ブレークポイントを設定する等して確認しましたか? let ud = NSUserDefaults.standardUserDefaults().stringForKey("tweetTemplate_preference") の次の行にブレークポイントを設定して、設定アプリで設定した後に 上記箇所が実行された段階でudの値を確認すれば、どういう状況なのか (設定値が正しく読み込まれてないのか、読み込めているんだけど適切な 場所に反映できてないのか)はっきりすると思います。 実行状況をちゃんと調べて問題点を絞り込んで行く必要があると思います。
お礼
引き続きご回答いただきありがとうございました。 補足にも記載しましたが、XCodeのアップデートがきっかけで正常に作動するようになりました。 ここまでお付き合い頂いたのに、このような形で申し訳有りません…
補足
ブレークポイントは設定していなかったのですが、udの値をprintしたり、画面に表示させたりしていました。 そのため、コードは実行されているが、正しく読み込まれていない、と判断しておりました。 …が、今回のXcode7.1へのアップデートを行ったところ、まったく同じテスト方法で同じソースコードなのですが、まったく問題なく動作するようになりました。 Xcodeのバグだったのか、一時ファイルが邪魔していたのか… あまり釈然とはしませんが、以前はできなかったテストパターン全てで成功したため、現時点では問題なく動いております。 ここまで付き合っていただいたのに、このような形で落ち着いてしまい、申し訳有りません… これが、再発することがないよう願っています…
お礼
ご回答ありがとうございました。 補足させていただきましたので、もしよろしければ引き続きよろしくお願いいたします。
補足
>コーディングに書かれている「tweetTemplate_preference」という名前と、root.plist内に定義したidが一致していますよね? root.plist内に定義したIDをコピペして同じことも確認済みなので、一致しています。 >そのコードがどこに書かれているかと、テストの仕方です。 記載されている場所は、Musicクラスのコンストラクタの中です。 Musicクラスのインスタンスは、struct構造体の中で初期値として生成しています。 struct ModelRepo { static var music : Music = Music() } …もしかしてこれが良くないのかなとも思いましたが、テストは設定アプリで設定値を変えた場合、毎回アプリケーションを停止させ起動し直しているので、コードは再実行されているものだと思われます。