2015-05-08 22 views
14

Tôi đang cố lưu trữ một mảng vào NSUserDefaults và truy xuất mảng khi cần thiết để điền UITableView.(Swift) Lưu trữ và truy xuất mảng vào NSUserDefaults

Hiện nay tôi đang sử dụng:

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

Nhưng tôi nhận được

fatal error: unexpectedly found nil while unwrapping an Optional value

khi cố gắng tải dữ liệu. Tôi không chắc liệu sự cố có nằm trong bộ nhớ hay truy xuất không. Có ai đã trải qua điều này trước đây không?

Trả lời

26

Từ mã của bạn tôi thấy bạn đang lưu trữ một số mảng

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

và truy xuất chuỗi

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

Có thể có loại không phù hợp, Bạn lưu trữ một loại và truy lục một loại khác.

Khi truy xuất hoặc sử dụng arrayForKey() hoặc objectForKey() hãy xem mã bên dưới.

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

hoặc

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

Nếu nó là một mảng tôi sẽ đi với một đầu tiên.

3

Bạn đang lưu trữ gì trong mảng?

Nếu đối tượng của nó không hoạt động, nếu chỉ là chuỗi hoặc số thì sẽ ổn thôi.

Các bước tiếp theo bạn cần phải bật các điểm ngắt ngoại lệ và có thể println() mọi thứ bạn có thể để xác định chính xác vị trí của sự cố.

Là một shot trong bóng tối tôi sẽ đề nghị có lẽ (identity.text!) Là sắp ra như bằng không

Cũng có lẽ bạn nên thay đổi nó thành này

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

    myArray = [tabledata!] 

    tableView.reloadData() 
} 

này sẽ làm cho mã không thậm chí cố gắng chạy trừ khi có một giá trị của nó có thể sử dụng

+0

Tôi in identity.text! và điều đó hoạt động đúng. Vì vậy, vấn đề là không có. Tôi đã thử chạy mã của bạn nhưng tôi vẫn nhận được lỗi tương tự. –

+0

println ("\ (tabledata) ') là những gì được trả về nil –

8

Dưới đây là cách bạn có thể lưu trữ và truy lục mảng đối tượng với sự trợ giúp của NSKeyArchive.

Để lưu mảng vào NSUserDefault.

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

Để truy xuất mảng từ 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) 
} 

Hy vọng điều này sẽ giúp bạn.

5

Tôi đã tìm đến câu hỏi này để tìm cách lưu mảng String thành UserDefaults nhưng không tìm thấy câu trả lời rõ ràng ở đây. Tuy nhiên, tôi đã tìm thấy câu trả lời trong How to save user settings using NSUserDefaults.Đọc bài viết đó để biết thêm thông tin.

tiết kiệm và Lấy ra một mảng String để UserDefaults

Lưu mảng

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

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

Lấy mảng

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

này đã được thay đổi trong nhanh chóng 3. Lưu ý rằng điều này làm việc với các thiết bị nhưng không phải sân chơi hoặc mô phỏng

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

phiên bản swift3 mới nhất để lưu trữ mảng dữ liệu vào userdefaults và nhận được rằng mảng dữ liệu sử dụng các phím

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) 
} 
Các vấn đề liên quan