2015-05-08 13 views
14

Próbuję zapisać tablicę do NSUserDefaults i pobrać tablicę, gdy jest ona wymagana do zapełnienia UITableView.(Swift) Przechowywanie i pobieranie tablicy do NSUserDefaults

Obecnie używam:

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

Ale pojawia

fatal error: unexpectedly found nil while unwrapping an Optional value

podczas próby ładowania danych. Nie jestem pewien, czy problem dotyczy przechowywania czy pobierania. Czy ktoś już to przeszedł?

Odpowiedz

26

z kodu widzę jesteś przechowywania trochę tablicę

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

i pobierania ciąg

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

Prawdopodobnie rodzaj niezgodności, przechowywać jeden rodzaj i pobrać inny typ.

Podczas pobierania użyj arrayForKey() lub objectForKey() zobacz poniższy kod.

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

lub

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

Jeśli jest tablicą pójdę z pierwszego.

3

Co przechowujesz w tablicy?

Jeśli to obiekty, to nie będzie działać, jeśli to tylko ciągi lub liczby, to powinno być dobrze.

Następne kroki należy podjąć, aby włączyć wyjątkowe punkty przerwania i może println() wszystko, co możliwe, aby dokładnie określić miejsce, w którym znajduje się problem.

Jako strzał w ciemno Sugerowałbym być może (identity.text!) Wychodzi za zerowy

Również powinieneś zmienić go na tym

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

    myArray = [tabledata!] 

    tableView.reloadData() 
} 

Spowoduje to, że kod nie nawet próby uruchomienia chyba że jest to wartość może korzystać

+0

wydrukowałem identity.text! i to działa poprawnie. Więc problemu nie ma. Próbowałem uruchomić twój kod, ale wciąż dostaję ten sam błąd. –

+0

println ("\ (tabledata)") to wartość, która zwraca zero –

8

Oto sposób, w jaki można przechowywać i pobrać tablicę obiektów przy pomocy NSKeyArchive.

Aby przechowywać tablicę do NSUserDefault.

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

do Źródło matrycy z 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) 
} 

Mam nadzieję, że ci to pomoże.

5

Przyszedłem do tego pytania, szukając sposobu na zapisanie tablicy String w UserDefaults, ale nie znalazłem tutaj jasnej odpowiedzi. Jednak znalazłem odpowiedź w How to save user settings using NSUserDefaults.Przeczytaj ten artykuł, aby uzyskać więcej informacji.

Zapisywanie i Pobieranie tablicy ciągów do UserDefaults

Zapisz tablica

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

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

Odzyskaj tablica

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

ten został zmieniony w szybkim 3. Zauważ, że to działa, ale z urządzeniem nie plac zabaw ani symulator

//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) 
} 
2

Aktualna wersja swift3 zapisać tablicę danych do userdefaults i uzyskać tablicę danych przy użyciu klawiszy

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

RetriveData

 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) 
} 
Powiązane problemy