2

「設定バンドル」を使用して、設定アプリケーションで選択した値を取得しようとしています。フィールドは「PSMultiValueSpecifier」です。「Root.plist」で実装しました:

  • タイプ: PSMultiValueSpecifier
  • タイトル: Abcdefg
  • キー: abcdefg
  • デフォルト値: aaa
  • 値 (配列):

     Item 0: aaa
     Item 1: bbb 
    
  • タイトル (配列):

    Item 0: A
    Item 1: B
    

そして、私が書いた実装ファイルに:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *string = [defaults objectForKey:@"abcdefg"];

しかし、「文字列」は空です。kind: "PSTextFieldSpecifier" のユーザー デフォルトで同じことを行うと、値を取得できます。

「Apress - Beginning iOS 5 Development: Exploring the iOS SDK」という書籍で説明されている手順に従いますが、選択した値を取得できません。

手順は「Apple Development Help」と同じです。

何が問題なのかわかりません。簡単そうです。

4

4 に答える 4

2

バグを発見しました。

"Settings.bundle" に "Multi Value" ユーザー設定を (その "Default Value" と共に) 実装し、iPhone シミュレーターの設定に入力したり、複数値の設定を変更したりしない場合、文は次のようになります。

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *string = [defaults objectForKey:@"key"];

「nil」値を返します。信じられない、私は問題を見つけようとして 1 週間を失いました!!!!

しかし、私には疑問があります:

「Multi Value」ユーザー設定を実装して iTunes Store でアプリを公開した場合、ユーザーがこの「Multi Value」ユーザー設定を使用しない場合、「NSUserDefaults」は nill 値を返しますか?

空の値を受け取る可能性を考慮する必要がありますか?

本当に、ばかげていると思います。

于 2012-09-07T08:00:17.080 に答える
1

いいえ、たとえば次のように、デフォルト値を登録する必要があると思います。

 -(BOOL) application: (UIApplication*) application didFinishLaunchingWithOptions: (NSDictionary*) launchOptions
{

     NSDictionary* defaults = @{@"key": @"default value"};
     [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
}

これは、アプリが含まれている設定バンドルについて何も知らないためです。本の430ページにBeginning iOS6 Development: Exploring the iOS SDKは、これについて明確な説明があります。

于 2013-05-20T14:48:25.040 に答える
1

DefaultValue公式の設定アプリでのみ使用されているようです。どうやら、1)設定の1つをテストしてNULLかどうかを確認し、次に2)設定を繰り返し、デフォルトを取得して設定することにより、デフォルトを登録する必要があります。

このための Obj-C コードのサンプルjust.do.it

PSMultiValueSpecifier に関するドキュメントは、ここでは不十分なようです。これに関する混乱は、SO と Web のいたるところに現れます。例えば:

于 2013-03-05T21:11:22.980 に答える
0

返されたオブジェクトが nil の場合、デフォルト値を設定します。

NSString * key = @"the key";
NSUserDefaults * uD = [NSUserDefaults standardUserDefaults];
NSString * stringValue = [uD objectForKey:key];

if (!stringValue) {
    stringValue = @"the default value";
    [uD registerDefaults:@{key: stringValue}];
}
于 2015-08-04T08:03:57.160 に答える