从UserDefaults检索字符串不起作用

时间:2018-10-10 08:52:22

标签: swift userdefaults

我在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应用。

2 个答案:

答案 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)