在 Swift 中写入设置包

Mit*_*hun 3 plist settings.bundle swift xcode6.3

我已经创建了一个带有设置包的应用程序,并且可以更改应用程序配置。从设置包读取完成。我正在使用下面的代码。

    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()
Run Code Online (Sandbox Code Playgroud)

相同的设置可以更新应用程序本身。但是如何将更新的值写入设置包?在此链接中,接受的答案说可以使用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;
Run Code Online (Sandbox Code Playgroud)

}

我有一个类似上述格式的设置包,我可以在应用程序中阅读它。但是如何根据我在应用程序中进行更改来更新此多值选择?我使用以下代码来更新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)
Run Code Online (Sandbox Code Playgroud)

ifa*_*fau 5

在您提供的链接中可以回答您的问题

请注意,您不应直接从设置包中读取,因为它没有任何意义。您应该始终使用 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
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

并改变:

NSUserDefaults.standardUserDefaults().setValue(true, forKey: "export_enabled")
Run Code Online (Sandbox Code Playgroud)

更新

设备上的 iOS 应用程序具有以下结构:

AppTitle.app
    AppTitle
    AppTitleIcon.png
    Info.plist
    com.company.apptitle.plist (read/write)
    settings.bundle (readonly)
Run Code Online (Sandbox Code Playgroud)

Settings.bundle用于在默认情况下形成配置层次结构Settings.app。它包含部分标题和设置类型,但设置值存储在com.company.apptitle.plist.

由于settings.bundle是只读的,您不能更改其结构或章节标题。您只能更改设置值,并且此更改发生在com.company.apptitle.plistvia 中NSUserDefaults