Запись в пакет настроек в Swift

Я создал приложение с пакетом настроек, и конфигурация приложения может быть изменена. Чтение из пакета настроек выполнено. Я использую приведенный ниже код.

    let defs: NSUserDefaults = NSUserDefaults.standardUserDefaults()
    defs.synchronize()

    var settingsBundle: NSString = NSBundle.mainBundle().pathForResource("Settings", ofType: "bundle")!
    if(settingsBundle.containsString("")){
        NSLog("Could not find Settings.bundle");
        return;
    }
    var settings: NSDictionary = NSDictionary(contentsOfFile: settingsBundle.stringByAppendingPathComponent("Root.plist"))!
    var preferences: NSArray = settings.objectForKey("PreferenceSpecifiers") as! NSArray
    var defaultsToRegister: NSMutableDictionary = NSMutableDictionary(capacity: preferences.count)

    for prefSpecification in preferences {
        if (prefSpecification.objectForKey("Key") != nil) {
            let key: NSString = prefSpecification.objectForKey("Key")! as! NSString
            if !key.containsString("") {
                let currentObject: AnyObject? = defs.objectForKey(key as! String)
                if currentObject == nil {
                    // not readable: set value from Settings.bundle
                    let objectToSet: AnyObject? = prefSpecification.objectForKey("DefaultValue")

                    var objectKey : String = key as! String
                    var finalObject : String = objectToSet as! String

                    defaultsToRegister.setObject(finalObject, forKey: objectKey)
                }else{
                    //already readable: don't touch
                    var objectKey : String = key as! String
                    var finalObject : String = currentObject as! String

                    defaultsToRegister.setObject(finalObject, forKey: objectKey)
                }
            }
        }
    }
    defs.registerDefaults(defaultsToRegister as [NSObject : AnyObject])
    defs.synchronize()

Эти же настройки можно обновить и в самом приложении. Но как я могу записать обновленные значения в пакет настроек? В этой ссылке принятый ответ говорит, что это возможно с помощью NSUserDefaults. Но я не мог, кто-нибудь может помочь?

ИЗМЕНИТЬ Пожалуйста, проверьте ниже для получения дополнительной информации:

{
PreferenceSpecifiers =     (
            {
        Title = Group;
        Type = PSGroupSpecifier;
    },
            {
        DefaultValue = Test1;
        Key = "multi_values";
        Title = "Multiple Values";
        Titles =             (
            FIrst,
            Second,
            Third
        );
        Type = PSMultiValueSpecifier;
        Values =             (
            FirstValue,
            SecondValue,
            ThirdValue
        );
    }
);
StringsTable = Root;

}

У меня есть пакет настроек, подобный приведенному выше формату, и я могу прочитать его в приложении. Но как я могу обновить этот выбор нескольких значений в соответствии с изменениями в приложении? Я использовал следующий код для обновления значения Title.

     var settings: NSDictionary = NSDictionary(contentsOfFile: settingsBundle.stringByAppendingPathComponent("Root.plist"))!
    var preferences: NSArray = settings.objectForKey("PreferenceSpecifiers") as! NSArray


    preferences.objectAtIndex(1).setValue("MutipleValue is updated", forKey: "Title")

    settings.setValue(preferences, forKey: "PreferenceSpecifiers")

    settings.writeToFile(settingsBundle.stringByAppendingPathComponent("Root.plist"), atomically: false)

person Mithun    schedule 18.09.2015    source источник


Ответы (1)


В предоставленной вами ссылке есть ответ на ваш вопрос.

Обратите внимание, что вам не следует напрямую читать из пакета настроек, так как это не имеет смысла. Вы должны всегда извлекать и устанавливать пользовательские значения по умолчанию с помощью NSUserDefaults. Когда пользователь вносит изменения в приложение настроек, NSUserDefaults автоматически отражает это. Они всегда будут синхронизированы.

Когда вы создаете новый элемент в settings.bundle, вы должны установить его identifier.

После этого вы можете получить требуемое значение с помощью NSUserDefaults следующим образом:

if let export_enabled = NSUserDefaults.standardUserDefaults().valueForKey("export_enabled") as? Bool
{
    if let export_interval = NSUserDefaults.standardUserDefaults().valueForKey("export_interval") as? Number
    {
        // ...
    }
}

И изменить:

NSUserDefaults.standardUserDefaults().setValue(true, forKey: "export_enabled")

Обновить

iOS-приложение на устройстве имеет следующую структуру:

AppTitle.app
    AppTitle
    AppTitleIcon.png
    Info.plist
    com.company.apptitle.plist (read/write)
    settings.bundle (readonly)

Settings.bundle предназначен для формирования конфигурационной иерархии по умолчанию Settings.app. Он содержит названия разделов и типы настроек, но значения настроек хранятся в com.company.apptitle.plist.

Поскольку settings.bundle доступен только для чтения, вы не можете изменить его структуру или заголовки разделов. Вы можете изменить только значения настроек, и это изменение происходит в com.company.apptitle.plist через NSUserDefaults.

person ifau    schedule 18.09.2015
comment
Спасибо за ответ. Для лучшего понимания моей проблемы я обновил свой вопрос. Не могли бы вы проверить это сейчас? - person Mithun; 18.09.2015
comment
У меня похожая проблема. Я могу прочитать настройку по умолчанию, которую можно изменить на странице настроек приложения для часов iPhone. Но если я попытаюсь установить какое-либо значение из приложения для часов и сохранить его по умолчанию, страница настроек в приложении для iPhone не отражает новый выбор. Похоже, это одностороннее общение. - person Kurt Lane; 11.05.2020