2011-01-30 15 views
4

iOSアプリケーションでいくつかの設定をカスタマイズできるように、環境設定パネルを使い始めました。Settings.bundleを作成してそこから情報にアクセスするのはかなり簡単でした。私の問題は、アップルのドキュメントで設定をプログラムで初期化する必要があるということです。iPhoneアプリケーションのデフォルトを初期化する場所

設定バンドルのプロパティリストに加えて、起動時にデフォルトのプリファレンス値をプログラムで登録することをお勧めします。新しくインストールされたアプリケーションの場合、アプリケーションの設定バンドルのデフォルトの設定値は、設定アプリケーションが実行されるまで設定されません。つまり、設定を実行する前にユーザーがアプリケーションを実行した場合、設定バンドルで指定されたデフォルト値は使用できなくなります。 この値をプログラム時に起動時に設定すると、アプリケーションに常に適切な値が設定されます。プログラムでデフォルト値を登録するには、NSUserDefaultsクラスのregisterDefaults:メソッドを使用します。

このアプリケーションではこの初期化が行われていますが、ユーザー提供の値を上書きしていないことを確認するにはどうすればよいですか。これはApp Delegateのいくつかのメソッドで処理されますか?しかし

潜在的ユーザーがにあなたのアプリを出す可能性があるため、あなたも:, applicationWillEnterForeground内部のいくつかのロジックが必要になる場合があります

答えて

11

NSUserDefaultsに格納されている値にアクセスする前に、デフォルト値を登録する必要があります。 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsでそれを行うことができます。
デフォルトを登録するのは速いので、これを最適化する必要はありません。アプリの立ち上げ時にやります。

私はplistの中で私のuserdefaultsを格納し、このように、このリストの内容を登録します。

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; 

あなたはこのようなあなたのデフォルト設定を登録する場合は、ユーザー入力値を上書きすることを心配する必要はありません。 NSUserdefaultsは値を格納する「ドメイン」を使用します。デフォルトを登録すると、それらは登録ドメインに保存されます。ユーザーが値を保管する場合、それらの値はアプリケーション・ドメインに保管されます。

NSUserdefaultsから値を取得しようとすると、値がアプリケーションドメインに存在するかどうかが調べられ、存在しない場合は登録ドメインから値が取得されます。


編集:

plist editor

(ユーザー提供の値が存在しない場合は、フォールバックとして、あるいはより良い、あなたのnsuserdefaultsに格納された値、およびそれらの)あなたがそれらの値にアクセスし

のようなこれは:

NSInteger minutesToWait = [[NSUserDefaults standardUserDefaults] integerForKey:@"MinutesToWait"; 
NSString *urlString = [[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultURLStr"]; 

plistは、キーと値を持つNSDictionaryの別の表現です。キーはuserdefaultsにアクセスするために使用するのと同じキーで、値はデフォルト値です。 かなりストレートです。
辞書をどのように作成するかは関係ありません。あなたはコードでもそれを行うことができます。

+0

それでは、そのplistのは、次のようになります。ここでは別の答えへのリンクが私のために働いた余分なコードを含む、ここですか?敬称に結びつけるキーと値のペアのセット?コードが ' - (void)applicationDidFinishLaunching:(UIApplication *)application'にあるか、' - (BOOL)application:(UIApplication *)アプリケーションdidFinishLaunchingWithOptions :(NSDictionary *)launchOptions'の中になければなりません何らかの理由? –

+0

@bill shiffあなたがあなたのuserdefaultsにアクセスしようとする前に、あなたが行っている限り、これをどこで行うかは関係ありません。残りの部分については、私の編集 –

+0

を参照してください。これは多くのデフォルトを一度に登録するのに最適です。 – memmons

0

あなたは、あなたの最初のウィンドウ、didFinishLaunchingWithOptionsセットアップに使用しているアプリのデリゲート内で同じ方法を使用することができます背景、設定アプリ内の設定を変更し、その後、あなたのアプリを再開し、それらの変更が適用されていることを期待してください。

1

@fluchtpunktは、使用してデフォルトを登録することができ、示唆したように:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultUserDefaults" ofType:@"plist"]]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; 

個人的に、私は独立して自分のアプリの委任の各値を確認してください。

#define kSettings [NSUserDefaults] 
if([kSettings boolForKey:@"firstRun"] == nil){ 

    // 
    // Set up the initial settings... 
    // 


    [kSettings setBool:NO forKey:@"firstRun"]; 
} 

私は「リセット」メソッドを書いて、最初に実行します。私はコードでこれを行うことを好むが、理論的にはplistを使うことができます。私はちょうどそれが間違って行く場所が少ないように感じる。

0

@MatthiasBauchや@ Mosheの答えはほとんどの人にとってはおそらくうまくいくでしょうが、私のような人はRoot.plistファイル(私はInAppSettingsKitを使用していました)に設定していますので、もっと深く掘り下げなければなりません特定のplistファイルは設定の実際のデフォルト値を取得します(plistの最上位にはないので、キーPreferenceSpecifiersの下にネストされています)。

https://stackoverflow.com/a/10497898/381233

関連する問題