2017-05-12 4 views
1

Je suis novice en matière de rapidité et essaye de stocker NSMutableArray dans Userdefaults. Voici ce que je suis doinig:La valeur par défaut de l'utilisateur donne une valeur nulle dans Swift 3.0

//to save aaray in user defaults 
var set:NSMutableArray = NSMutableArray(objects: self.listId) 
    self.saveListIdArray(set) 

func saveListIdArray(_ params: NSMutableArray = []) { 
let defaults = UserDefaults.standard 
defaults.set(params, forKey: "ArrayKey") 
defaults.synchronize() 

}

//to get array from user default 
func getUserDefaultKeyForAllObject(key userDefaultsKey: String) -> NSMutableArray { 
let array = UserDefaults.standard.object(forKey: NSUserDefaultsKey.LIST_ID_ARRAY) as! NSMutableArray 
print(array) 
return array 

}

App avec crashes "erreur fatale: de façon inattendue nulle en déballant une valeur facultative" d'exception. Ignorez la façon dont je pose la question, aidez-moi ici.

Merci.

+0

1. Ne pas utiliser 'NSMutableArray' à Swift. Utilisez un tableau Swift. 2. Quels types d'objets sont dans le tableau? – rmaddy

Répondre

2

Essayez de convertir à NSData puis stocker à NSUserDefaults comme ci-dessous

func saveListIdArray(_ params: NSMutableArray = []) { 
let data = NSKeyedArchiver.archivedData(withRootObject: params) 

UserDefaults.standard.set(data, forKey: "test") 
UserDefaults.standard.synchronize() 
} 

Pour récupérer les données, utilisez

if let data = UserDefaults.standard.object(forKey: "test") as? Data { 
    if let storedData = NSKeyedUnarchiver.unarchiveObject(with: data) as? NSMutableArray 
{ 
      // In here you can access your array 
} 
} 
1

Vous forcez le déploiement de NSMutableArray pour une clé. Ne forcez pas le déballage lorsque vous essayez d'obtenir la valeur d'un dictionnaire ou UserDefault pour une clé, car il se peut que la valeur n'existe pas pour cette clé et que le déballage de la force entraîne le blocage de votre application.

Pour ce faire, comme:

//to get array from user default 
if let array = UserDefaults.standard.object(forKey:"ArrayKey") as? NSMutableArray 
    print(array) 
    } 
1

J'ai 2 raisons possibles ceci:

  1. Vous devez être sûr à 100% que vous récupérez la matrice avec la même clé que celle avec laquelle vous l'enregistrez. Dans votre code, vous enregistrez le tableau avec "ArrayKey" mais en le récupérant avec NSUserDefaultsKey.LIST_ID_ARRAY, êtes-vous sûr que c'est la même chaîne?
  2. Quel type de données est self.listId? Si c'est une classe personnalisée, vous devez faire cette classe sont conformes au protocole de NSCoding, puis encodez à des données et enregistrer que les userDefaults (Save custom objects into NSUserDefaults)

Une 3ème raison est que vous essayez d'obtenir un objet à partir des valeurs par défaut sans jamais rien y écrire. Essayez de changer

let array = UserDefaults.standard.object(forKey: NSUserDefaultsKey.LIST_ID_ARRAY) as! NSMutableArray 
print(array) 
return array 

à

if let array = UserDefaults.standard.object(forKey: "ArrayKey") as? NSMutableArray { 
    print(array) 
    return array 
} 
else { 
    return NSMutableArray() 
} 
+0

Ok, votre premier point est rempli, c'est-à-dire que j'utilise la même touche. Deuxièmement, la liste est la chaîne que je stocke dans le tableau coz j'ai besoin de stocker plusieurs listIds dans le tableau en fonction des éléments que l'utilisateur sélectionne. –

+0

OK, donc il semble qu'il y ait une 3ème raison: Vous essayez d'accéder à l'objet à partir de l'userdefaults avant de stocker quoi que ce soit. 'UserDefaults.standard.object (forKey: NSUserDefaultsKey.LIST_ID_ARRAY)' retourne zéro et vous essayez de le convertir en NSMutableArray qui va planter – SveinnV