2016-08-28 2 views
-1

Chaque fois que j'enregistrer une couleur comme indiqué ci-dessous:Erreur NSUserDefaults couleur (Swift)

slitherColor = sender.currentTitleColor 
let userDefaults3 = NSUserDefaults.standardUserDefaults() 
userDefaults3.setValue(slitherColor, forKey: "SSlitherC") 
userDefaults3.synchronize() 

J'obtiens une erreur SIGABRT. Lorsque l'écran premier chargement, ce que je chargeais les données non existant qui a travaillé sans bogues:

let userDefaults3 = NSUserDefaults.standardUserDefaults() 
if let slitherColor2 = userDefaults.valueForKey("SSlitherC") { 
    slitherColor = slitherColor2 as! UIColor 
    } 
    else { 
    slitherColor = UIColor.yellowColor()  
    } 

Toute aide sur la façon de corriger ce bug? En outre, voici le message bug SIGABRT:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object UIDeviceRGBColorSpace 0.0352708 1 0.161752 1 for key SSlitherC' 
+1

'UIColor's ne peuvent pas être enregistrés directement' NSUserDefaults'. –

Répondre

0

UIColors ne peuvent pas être enregistrés directement dans NSUserDefaults parce NSUserDefaults est fondamentalement une manière glorifiée d'accéder à un fichier plist pour votre application. Au lieu de cela, vous pouvez archiver et désarchiver la couleur avec NSKeyedArchiver afin de pouvoir l'enregistrer correctement.

Changer votre code d'économie à:

slitherColor = sender.currentTitleColor 
let userDefaults3 = NSUserDefaults.standardUserDefaults() 
let slitherColorData = NSKeyedArchiver.archivedDataWithRootObject(slitherColor) 
userDefaults3.setObject(slitherColorData, forKey: "SSlitherC") 
userDefaults3.synchronize() 

et le code qui obtient la couleur:

let userDefaults3 = NSUserDefaults.standardUserDefaults() 
if let slitherColorData2 = userDefaults3.dataForKey("SSlitherC"), let slitherColor2 = NSKeyedUnarchiver.unarchiveObjectWithData(colorData) as? UIColor { 
    slitherColor = slitherColor2 
} else { 
    slitherColor = UIColor.yellowColor()  
} 
+0

(colorData) dans la deuxième partie ne fonctionne pas. Que voulez-vous dire? –

+0

ne me dérange pas mon commentaire ci-dessus. J'ai réparé cette partie. Maintenant je cours le code et obtiens une autre erreur de SIGABRT: Terminant l'application due à l'exception uncaught 'NSInvalidArgumentException', raison: '*** -CGColor non défini pour l'UIColor ; devez d'abord convertir l'espace de couleurs.' Cela se produit lorsque j'essaie de charger les couleurs que j'ai déjà sauvegardées. Aide Pls –

+0

A propos de @Stacksza J'ai remplacé "colorData" par "archivedDataWithRootObject (slitherColor)" –

0

Vous ne pouvez pas enregistrer UIColor directement au NSUserDefaults, à faire que vous avez besoin d'archiver et désarchiver l'objet de couleur et enregistrer les données. Pour enregistrer:

let colorData = NSKeyedArchiver.archivedDataWithRootObject(slitherColor) 
userDefaults3.setObject(slitherColor, forKey: "SSlitherC") 

et de revenir:

if let colorData = userDefaults3.dataForKey(key) { 
    let color = NSKeyedUnarchiver.unarchiveObjectWithData(colorData) as? UIColor 
} 

Here est l'extension sur NSUserDefautls qui aide à sauver et récupérer des données. Je vais copier le code ici dans le cas où le fichier Gist a été supprimé, nous avons encore des informations valides.

extension NSUserDefaults { 

    func colorForKey(key: String) -> UIColor? { 
     var color: UIColor? 
     if let colorData = dataForKey(key) { 
      color = NSKeyedUnarchiver.unarchiveObjectWithData(colorData) as? UIColor 
     } 
     return color 
    } 

    func setColor(color: UIColor?, forKey key: String) { 
     var colorData: NSData? 
     if let color = color { 
      colorData = NSKeyedArchiver.archivedDataWithRootObject(color) 
     } 
     setObject(colorData, forKey: key) 
    } 

} 

vous pouvez appeler cette méthode

  1. Pour définir la couleur sauver userDefaults.setColor(color: color, forKey key: key)

  2. Pour obtenir la clé couleur userDefaults.colorForKey(key)

Swift 3.0:

UserDefaults extension {

func color(forKey key: String) -> UIColor? { 
    var color: UIColor? 
    if let colorData = data(forKey: key) { 
     color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor 
    } 
    return color 
} 

func set(color: UIColor?, forKey key: String) { 
    var colorData: NSData? 
    if let color = color { 
     colorData = NSKeyedArchiver.archivedData(withRootObject: color) 
    } 
    set(colorData, forKey: key) 
} 

} 

Utilisation:

let userDefault = UserDefaults.standard 
userDefault.set(color: color, forKey: key) 
userDefault.color(forKey: key) 
+0

Pouvez-vous être plus précis?(Utilisation de mes données et objets dans l'exemple) –

+0

Vous ne pouvez pas enregistrer tous les objets personnalisés dans les valeurs par défaut de l'utilisateur. Pour cela, vous devez l'archiver dans NSData, puis l'enregistrer en tant qu'objet. Je suggère de copier cette extention et d'utiliser ces méthodes, il va prendre soin de tout. –

+0

@AndyLebo J'ai également une mise à jour pour swift 3.0. Copiez l'extension de collage et utilisez la couleur et la couleur définies pour les méthodes clés. –