web-dev-qa-db-ja.com

(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が予期せずに見つかりました

データをロードしようとしたとき。問題がストレージにあるのか検索にあるのかわかりません。誰もこれを経験したことがありますか?

18
William Larson

あなたのコードから、あなたはいくつかの配列を保存していることがわかります

_// 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")
_

配列の場合は、最初のものを使用します。

31
Vivek Molkar

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

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

これがお役に立てば幸いです。

10

アレイに何を保存していますか?

オブジェクトの場合は機能しません。文字列または数字の場合は問題ありません。

次のステップは、例外ブレークポイントをオンにして、おそらくprintln()を有効にして、問題の正確な位置を特定できるようにすることです。

暗闇の中でのショットとして、多分(identity.text!)

また、おそらくこれに変更する必要があります

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

    myArray = [tabledata!]

    tableView.reloadData()
}

これにより、使用できる値がない限り、コードは実行されません。

3
RyanOfCourse

データの配列をユーザーデフォルトに保存し、キーを使用してそのデータの配列を取得する最新のSwift3バージョン

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

これは、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)
}
1
flame3