繁体   English   中英

在 Swift/Xcode 6 中返回设置包开关的值

[英]Returning the value of a settings bundle switch in Swift / Xcode 6

我很难返回存储的布尔键的值。

我的 root.plist 看起来像这样:

在此处输入图片说明

我在 AppDelegate 中有这个:

    let a = NSUserDefaults.standardUserDefaults().boolForKey("sound")

    if a { // This is where it breaks
        println("sound is on")
    }

任何想法我做错了什么?

首先,您应该注册默认值,以便同步所有内容并分配默认值。 然后你就会知道一个值存在。 这些值在启动时不会自动同步。

var appDefaults = Dictionary<String, AnyObject>()
appDefaults["sound"] = false
NSUserDefaults.standardUserDefaults().registerDefaults(appDefaults)
NSUserDefaults.standardUserDefaults().synchronize()

let a = NSUserDefaults.standardUserDefaults().boolForKey("sound")

if a { // This is where it breaks
    println("sound is on")
}

以下是相关文章的摘录。

当您的应用程序使用设置包时

请记住,您还应该使用 registerDefaults: 当您的应用程序使用设置包时。 由于您已经在设置包的 plist 中指定了默认值,您可能希望您的应用程序自动选择这些值。 然而,事实并非如此。 设置包中包含的信息只能由 iOS Settings.app 读取,而不会由您的应用读取。 为了让您的应用程序使用与 Settings.app 中显示的相同的默认值,您必须手动将用户默认键及其默认值复制到单独的 plist 文件中,并将其注册到默认数据库,如上所示。

这里是直接来自苹果的相关讨论。

注册默认值

讨论

如果没有注册域,则使用指定的字典创建一个,并将 NSRegistrationDomain 添加到搜索列表的末尾。 注册域的内容不写入磁盘; 每次应用程序启动时都需要调用此方法。 您可以将 plist 文件放在应用程序的 Resources 目录中,并使用从该文件中读入的内容调用 registerDefaults:。

用这个:

    var myDict: NSDictionary?
// Read from the Configuration plist the data to make the state of the object valid.
    if let path = NSBundle.mainBundle().pathForResource("root", ofType: "plist") {
        myDict = NSDictionary(contentsOfFile: path)
    }

    // Set the values to init the object
    if let dict = myDict {
        if let a = dict["sound"] as? Bool {
         if a { 
            println("sound is on")
          }
        }
    }

我今天遇到了同样的问题,所以我来到了这篇文章,对这个注释不是很满意:

为了让您的应用程序使用与 Settings.app 中显示的相同的默认值,您必须手动将用户默认键及其默认值复制到单独的 plist 文件中,并将其注册到默认数据库,如上所示。

我认为必须有一个更 DRY 的解决方案,所以我做了以下扩展。 它遍历 Settings.bundle 的 plists(包括 Child plists)并注册它找到的任何DefaultValues 也可以在这个 gist 中找到

extension UserDefaults {

    static func syncSettingsBundle() {
        if let bundlePath = Bundle.main.path(forResource: "Settings", ofType: "bundle"),
            let plistPath = URL(string: bundlePath)?.appendingPathComponent("Root.plist").absoluteString {

            let defaultDefaults = UserDefaults.defaultsForPlist(path: plistPath, defaults: [:])
            UserDefaults.standard.register(defaults: defaultDefaults)
        }
    }

    static private func defaultsForPlist(path: String, defaults: [String: Any]) -> [String: Any] {
        var mutableDefaults = defaults
        if let plistXML = FileManager.default.contents(atPath: path) {
            do {
                let plistData = try PropertyListSerialization.propertyList(from: plistXML,
                                                                           options: .mutableContainersAndLeaves,
                                                                           format: nil) as! [String:AnyObject]
                if let prefs = plistData["PreferenceSpecifiers"] as? Array<[String: Any]> {
                    prefs.forEach { (pref: [String : Any]) in
                        if let key = pref["Key"] as? String,
                            let value = pref["DefaultValue"] {
                            mutableDefaults[key] = value
                        } else if let type = pref["Type"] as? String,
                            type == "PSChildPaneSpecifier",
                            let file = pref["File"] as? String,
                            let childPath = URL(string: path)?
                                .deletingLastPathComponent()
                                .appendingPathComponent(file)
                                .absoluteString {
                            mutableDefaults = UserDefaults.defaultsForPlist(path: childPath, defaults: mutableDefaults)
                        }
                    }
                } else {
                    print("Error no PreferenceSpecifiers in \(path)")
                }
            } catch {
                print("Error reading plist: \(error) in \(path)")
            }
        } else {
            print("No plist found found at \(path)")
        }
        return mutableDefaults
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM