4

iOS アプリケーションに Settings.bundle ファイルを追加しています。1 つまたは 2 つの設定で非常に最小限です。Settings.bundle の plist ファイルは、設定アプリケーションのデフォルトを指定します。iOS アプリケーションがこれらのデフォルトを認識できるようにするには、それらをアプリケーションにコーディングする必要があることを読みました。これは、プログラムを変更するときに簡単に同期が取れなくなるように、自分自身を繰り返し、デフォルトの開口部を残しているようです。

次のように、plist ファイルの内容を使用してデフォルトを登録できることはわかっています。

[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]];

でも、それも繰り返しているようです。Settings.bundle の plist ファイルをこれらのデフォルトのソースとして使用して、デフォルトを 1 つの場所でのみ指定することはできますか?

その負荷を次のように調整することにしました。

[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Settings.bundle/Root" ofType:@"plist"]]];

しかし、それはうまくいきませんでした。これが可能かどうか、およびそのplistファイルをロードする方法を知っている人はいますか?

4

4 に答える 4

3

これをアンディの回答にコメントとして追加したかったのですが、スタック オーバーフローでは許可されませんでした (コメントには長すぎます)。
ObjC を使用している場合、バージョンは次のとおりです。

-(void)registerDefaults
{
    NSString* pathString = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Settings.bundle"];
    NSString* rootPath = [pathString stringByAppendingPathComponent:@"Root.plist"];
    NSDictionary* settingsDict = [NSDictionary dictionaryWithContentsOfFile:rootPath];
    NSArray* prefSpecifiers = settingsDict[@"PreferenceSpecifiers"] ;

    NSMutableDictionary* defaults = [NSMutableDictionary dictionary];

    for (NSDictionary* item in prefSpecifiers) {
        NSString* theKey = item[@"Key"];
        NSObject* defaultValue = item[@"DefaultValue"];

        if (defaultValue && theKey) {
            defaults[theKey] = defaultValue;
        }

    }

    if (defaults.count > 0) {
        [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
    }

}
于 2015-04-29T11:41:37.653 に答える
1

はい、可能です。Swift でそれを行う方法は次のとおりです。

func loadDefaults() {

    let pathStr = NSBundle.mainBundle().bundlePath
    let settingsBundlePath = pathStr.stringByAppendingPathComponent("Settings.bundle")
    let finalPath = settingsBundlePath.stringByAppendingPathComponent("Root.plist")
    let settingsDict = NSDictionary(contentsOfFile: finalPath)
    let prefSpecifierArray = settingsDict?.objectForKey("PreferenceSpecifiers") as NSArray

    var defaults:[NSObject:AnyObject] = [:]

    for prefItem in prefSpecifierArray {

        if let key = prefItem.objectForKey("Key") as String! {

            let defaultValue:AnyObject? = prefItem.objectForKey("DefaultValue")
            defaults[key] = defaultValue
        }
    }

    _userDefaults.registerDefaults(defaults)
}

これにより、キーを使用して各 PreferenceSpecifier から DefaultValue がロードされます。例えば:

<dict>
    <key>Type</key>
    <string>PSMultiValueSpecifier</string>
    <key>Title</key>
    <string>Frequency</string>
    <key>Key</key>
    <string>frequency</string>
    <key>DefaultValue</key>
    <integer>15</integer>
    <key>Titles</key>
    <array>
        <string>5 minutes</string>
        <string>15 minutes</string>
        <string>30 minutes</string>
        <string>60 minutes</string>
    </array>
    <key>Values</key>
    <array>
        <integer>5</integer>
        <integer>15</integer>
        <integer>30</integer>
        <integer>60</integer>
    </array>
</dict>

このloadDefaults関数は、デフォルト値の 15 を「頻度」のユーザー デフォルトにロードします。

次のように、ハンドラーloadDefaultsからアプリのデリゲート関数を呼び出すことをお勧めします。didFinishLaunchingWithOptions

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    loadDefaults()

    return true
}

その後、アプリの後半で、たとえば aUITableViewControllerで、次のようにユーザーのデフォルト値をロードできます。

let kFrequency = "frequency"
frequency = _userDefaults.integerForKey(kFrequency)
于 2015-02-27T15:46:02.387 に答える
-1

これは必須ではありません。たとえば、plist で割り当てられたキーを呼び出すことで、plist 内のデータを呼び出すことができます。

_buttonSelection = [[NSUserDefaults standardUserDefaults] stringForKey:@"buttonAction01"]; //_buttonSelection is a NSString so that can be anything
于 2012-12-29T03:00:49.377 に答える