[英]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.