В моем проекте есть кнопка предупреждения с UITextField, которая позволяет мне вводить строку, которая затем добавляется к массиву, который я объявил глобально. Это дополнение позволяет другому UITextField отображать добавление в раскрывающемся меню. Однако изменения будут сохраняться только до тех пор, пока приложение остается открытым, и не сохранятся, когда я попытаюсь настроить UserDefaults.
Я прочитал то, что выглядело похоже на S.O. сообщения, но я не могу получить ни одно из решений для работы с моей проблемой.
(Это объявлено глобально.)
let defaults = UserDefaults.standard
(Это также глобально.)
var needIndicatorArray: [String] = ["SNAP", "EBT", "FVRX"]
(Это код, который я использую для добавления вышеупомянутого массива. Этот код добавит массив, но не сохранит добавление после закрытия и повторного открытия приложения.)
@IBAction func addNeedIndicator(_ sender: UIBarButtonItem) {
var textField = UITextField()
let alert = UIAlertController(title: "Add Need Indicator", message: "", preferredStyle: .alert)
let action = UIAlertAction(title: "Add Item", style: .default) { (action) in
//This should append the global array once the user hits the add item on the UIAlert
self.needIndicatorArray.append(textField.text!)
}
alert.addTextField { (alertTextField) in
alertTextField.placeholder = "Create new item"
textField = alertTextField
}
alert.addAction(action)
present(alert, animated: true, completion: nil)
}



Я не вижу, где вы на самом деле пишете по умолчанию. У вас должна получиться строка с чем-то вроде:
defaults.set(needIndicatorArray, forKey: "someKey")
Но также вы никогда не проверяете, что находится по умолчанию. Вам нужно загрузить его чем-то вроде:
needIndicatorArray = defaults.object(forKey: "someKey") as? [String] ?? ["SNAP", "EBT", "FVRX"]
Кстати, все глобальные переменные ленивы, и вы не должны зависеть от них. Вам лучше объявить их локально или как статические в каком-либо классе или структуре. Кстати, когда я говорю «ленивый», я имею в виду тип переменной, не комментируя ваш стиль кодирования. Ленивая переменная может потерять ссылку при определенных условиях.
Вам нужно сохранить значения по умолчанию для пользователя, а затем прочитать массив, когда это необходимо.
Я только что включил соответствующий раздел ниже, когда вы должны сохранить настройки по умолчанию:
let action = UIAlertAction(title: "Add Item", style: .default) { (action) in
// This should append the global array once the user hits the add item on the UIAlert
self.needIndicatorArray.append(textField.text!)
// You need to save to User Defaults
defaults.set(needIndicatorArray, forKey: "yourKey")
}
Когда вам нужно получить массив, используйте это:
let array = defaults.object(forKey: "yourKey") as? [String] ?? [String]()
Спасибо. Это было очень полезно.
Да, в самом деле. Работал как чемпион.
Ха! Я не слышал о "ленивых" переменных. Я попытаюсь добавить их статически в структуру. Спасибо за руководство.