我在Swift中创建了一个简单的应用,其中包含一个WebViewControl
。借助SettingsBundle
,用户可以指定一个URL,然后在WebView中打开该URL。 Root.plist
看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSTextFieldSpecifier</string>
<key>Title</key>
<string>URL</string>
<key>Key</key>
<string>app_url</string>
<key>DefaultValue</key>
<string>https://myurl.com</string>
<key>IsSecure</key>
<false/>
<key>KeyboardType</key>
<string>URL</string>
<key>AutocapitalizationType</key>
<string>None</string>
<key>AutocorrectionType</key>
<string>No</string>
</dict>
</array>
</dict>
</plist>
这很好。但是,当尝试在Swift中检索app_url
时,我遇到了问题。
override func viewDidLoad() {
super.viewDidLoad()
registerSettingsBundle()
print("retrieving key")
if let appUrl = UserDefaults.standard.string(forKey: "app_url") {
print("got it " + appUrl)
}
}
func registerSettingsBundle(){
let appDefaults = [String:AnyObject]()
UserDefaults.standard.register(defaults: appDefaults)
}
这会将retrieving key
打印到控制台,但不会打印第二个打印语句。
它已经工作了一段时间,但是最近的更新将其破坏了。我究竟做错了什么? API是否有所更改?我读了the documentation from Apple on UserDefaults,但到目前为止对我没有帮助。
针对marked as duplicate
进行编辑:用户能够使用iOS中的“设置”应用更改app_url
,这一点至关重要。仅读取plist文件作为字典是不够的。请原谅,这是我第一次尝试iOS应用。
答案 0 :(得分:0)
我重新提出了问题,因为它不是重复的。无论如何,settings
plist不应在代码中打开。
问题是registerSettingsBundle
。调用此方法后,默认字典为空,检索任何数据将失败。在设置捆绑包中声明默认值时,请勿调用registerSettingsBundle
。
registerSettingsBundle()
由于类型是URL,请使用url(forKey
答案 1 :(得分:-1)
您正在尝试从plist
获取数据,因此您需要这样做
if let path = Bundle.main.path(forResource: "SettingsBundle", ofType: "plist") {
//plist contain root as Array
if let arrayData = NSArray(contentsOfFile: path) as? [[String: Any]] {
}
//Or plist contain root as Dictionary
if let dictData = NSDictionary(contentsOfFile: path) as? [String: Any] {
}
}
如果您想更改plist数据,请使用以下命令:
var dictionaryPath = NSBundle.mainBundle().pathForResource("SettingsBundle", ofType: "plist")
var dictionary = NSMutableDictionary(contentsOfFile: dictionaryPath!)
var array = dictionary?.objectForKey("key")? as NSMutableArray
//this is a label I have called player1Name
array[0] = ""
playersDictionary?.writeToFile(dictionaryPath!, atomically: true)