返回交换机值 settings bundle 在 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"/
}


以下是相关文章的摘录。

http://oleb.net/blog/2014/02/n ... lues/
请记住,您还应该使用 registerDefaults: 当您的应用程序使用设置时 Bundle. 由于您已经指定了默认值 plist settings bundle, 您可以预期您的应用程序自动选择它们。 但是,它不是。 设置中包含的信息 bundle, 只读 iOS Settings.app 而不是你的申请。
您的应用程序使用与内部相同的默认值 Settings.app, 您必须在单独的文件中手动复制默认自定义密钥及其默认值。 plist 并在默认数据库中注册它,如上所示。



https://developer.apple.com/li ... ults:
- 这是直接来自的相应讨论 Apple.

默认值注册

讨论

如果没有注册域,则使用指定的字典创建它 NSRegistrationDomain 添加到搜索列表的末尾。
磁盘上未记录注册域的内容; 您需要每次启动应用程序时调用此方法。 您可以放置​​文件 plist 在应用程序资源目录和呼叫中 registerDefaults: 使用您从此文件中读取的内容。
</string,>

石油百科

赞同来自:

用它:


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's plists /包括子公司 plists/ 和注册任何
DefaultValues

, 他发现了。 也可提供
https://gist.github.com/atomoi ... 394b7
.


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
}
}

要回复问题请先登录注册