Получение строки из UserDefaults не работает - PullRequest
0 голосов
/ 10 октября 2018

Я создал простое приложение в Swift, которое содержит WebViewControl.Благодаря SettingsBundle пользователь может указать URL, который затем открывается в WebView.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>

Это отлично работает.Однако при попытке получить app_url в Swift у меня возникла проблема.

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 как-то?Я прочитал документацию Apple по UserDefaults , но она мне пока не помогла.

Правка в отношении marked as duplicate: крайне важно, чтобы пользовательвозможность изменить app_url с помощью приложения Настройки в iOS.Просто чтение файла plist как dict недостаточно.Пожалуйста, извините, я впервые экспериментирую с приложениями для iOS.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Я снова открыл вопрос, потому что это не дубликат.Список settings не должен открываться в коде в любом случае.

Проблема в registerSettingsBundle.После вызова этого метода словарь по умолчанию пуст, и получение любых данных не удастся.Не звоните registerSettingsBundle, поскольку вы объявили значение по умолчанию в комплекте настроек.

registerSettingsBundle()

В качестве типа URL используется url(forKey

0 голосов
/ 10 октября 2018

Вы пытаетесь получить данные от 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)
...