Подтвердить что ты не робот

(Swift) Сохранение и извлечение массива в NSUserDefaults

Я пытаюсь сохранить массив NSUserDefaults и извлекать массив, когда необходимо, чтобы заполнить UITableView.

В настоящее время я использую:

//store data
NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "\(identity.text!)listA")                    
NSUserDefaults.standardUserDefaults().synchronize()

//retrieve data
let tabledata = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA")
myArray = [tabledata!]
tableView.reloadData()

Но я получаю

Неустранимая ошибка: неожиданно найден nil при развертывании необязательного Значение

при попытке загрузить данные. Я не уверен, проблема в хранении или извлечении. Кто-нибудь прошел через это раньше?

4b9b3361

Ответ 1

Из вашего кода я вижу, что вы храните некоторый массив

// Your code
NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "\(identity.text!)listA")

и извлечение строки

//Your code
let tabledata = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA")

Возможно, существует несоответствие типа. Вы сохраняете один тип и извлекаете другой тип.

При извлечении либо используйте arrayForKey(), либо objectForKey(), см. код ниже.

let tabledata = NSUserDefaults.standardUserDefaults().arrayForKey("\(identity.text!)listA") 

или

let tabledata = NSUserDefaults.standardUserDefaults().objectForKey("\(identity.text!)listA")

Если это массив, я бы пошел с первым.

Ответ 2

Вот как вы можете сохранить и получить массив объектов с помощью NSKeyArchive.

Сохранить массив в NSUserDefault.

let placesData = NSKeyedArchiver.archivedData(withRootObject: placesArray)
UserDefaults.standard.set(placesData, forKey: "places")

Возвращенный массив из NSUserDefault.

let placesData = UserDefaults.standard.object(forKey: "places") as? NSData

if let placesData = placesData {
    let placesArray = NSKeyedUnarchiver.unarchiveObject(with: placesData as Data) as? [Place]
    print(placesArray)
}

Надеюсь, что это поможет вам.

Ответ 3

Я пришел к этому вопросу, глядя, как сохранить массив String в UserDefaults, но не нашел здесь ясного ответа. Тем не менее, я нашел ответ в Как сохранить пользовательские настройки с помощью NSUserDefaults. Прочтите эту статью для получения дополнительной информации.

Сохранение и получение массива строк в UserDefaults

Сохранить массив

let array = ["horse", "cow", "camel", "sheep", "goat"]

let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedStringArray")

Получить массив

let defaults = UserDefaults.standard
let array = defaults.object(forKey: "SavedStringArray") as? [String] ?? [String]()

Ответ 4

Что вы храните в массиве?

Если это объекты, это не сработает, если это просто строки или числа, тогда это должно быть хорошо.

Следующие шаги, которые вы предпримете, должны состоять в том, чтобы включить контрольные точки исключения и, возможно, println() все, что вы можете, чтобы вы могли точно определить местонахождение проблемы.

Как выстрел в темноте я бы предположил, что (identity.text!) выходит как ниль

Также вы должны, вероятно, изменить его на

if let tabledata: NSArray = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA"){

    myArray = [tabledata!]

    tableView.reloadData()
}

Это приведет к тому, что код даже не попытается запустить, если нет значения, которое он может использовать

Ответ 5

Это было изменено в swift 3. Обратите внимание, что это работает с устройством, но не с игровой площадкой или симулятором.

//store the array
let array = ["horse", "cow", "camel", "sheep", "goat"]

let defaults = UserDefaults.standard

defaults.setValue(array, forKey: "history")

defaults.synchronize()

//Retrieve the array
if((UserDefaults.standard.array(forKey: "history")) != nil){
    let historyWords = (UserDefaults.standard.array(forKey: "history") as? [String])!
    print(historyWords)
}

Ответ 6

Последняя версия swift3 для хранения массива данных в userdefaults и получения этого массива данных с помощью клавиш

    let nameArray = ["Ramu","JAGAN","Steve","Swift"]
    let namesArrayData = NSKeyedArchiver.archivedData(withRootObject: nameArray)
    UserDefaults.standard.set(namesArrayData, forKey: "arrayData")

RetriveData​​p >

        let retriveArrayData= UserDefaults.standard.object(forKey:  "arrayData") as? NSData

   if let retriveArrayData= namesArrayData{
  let retriveArray = NSKeyedUnarchiver.unarchiveObject(with: namesArraydata as Data) as? [nameArray]
  print(retriveArray )
}