Добавить массив и сохранить в UserDefaults (Swift)

В моем проекте есть кнопка предупреждения с 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)
    }
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
114
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не вижу, где вы на самом деле пишете по умолчанию. У вас должна получиться строка с чем-то вроде: defaults.set(needIndicatorArray, forKey: "someKey")

Но также вы никогда не проверяете, что находится по умолчанию. Вам нужно загрузить его чем-то вроде: needIndicatorArray = defaults.object(forKey: "someKey") as? [String] ?? ["SNAP", "EBT", "FVRX"]

Кстати, все глобальные переменные ленивы, и вы не должны зависеть от них. Вам лучше объявить их локально или как статические в каком-либо классе или структуре. Кстати, когда я говорю «ленивый», я имею в виду тип переменной, не комментируя ваш стиль кодирования. Ленивая переменная может потерять ссылку при определенных условиях.

Ха! Я не слышал о "ленивых" переменных. Я попытаюсь добавить их статически в структуру. Спасибо за руководство.

aaron228 26.04.2019 22:18
Ответ принят как подходящий

Вам нужно сохранить значения по умолчанию для пользователя, а затем прочитать массив, когда это необходимо.

Я только что включил соответствующий раздел ниже, когда вы должны сохранить настройки по умолчанию:

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]()

Спасибо. Это было очень полезно.

aaron228 26.04.2019 22:15

Да, в самом деле. Работал как чемпион.

aaron228 29.04.2019 13:23

Другие вопросы по теме