2016-08-28 3 views
-1

NSUserDefaults色誤差(スウィフト)は、以下に示すように、私は色を保存するたびに

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

は私がSIGABRTエラーが発生します。ときに画面が最初にロード、これは私がバグなしで働いていた実在しないデータをロードするために使用するものである:

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

このバグを修正する方法上の任意のヘルプ?また、ここでSIGABRTバグメッセージは次のとおりです。NSUserDefaultsは基本的にアプリのplistファイルにアクセスするための見せかけの方法であるため、

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直接NSUserDefaults' 'に保存することができません。 –

答えて

0

UIColorsは直接NSUserDefaultsに保存することはできません。その代わりに、NSKeyedArchiverで色をアーカイブして保存することができますので、適切に保存することができます。あなたはアーカイブする必要があることを行うには、直接NSUserDefaultsUIColorを保存することはできません

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)は動作しません。どういう意味ですか? –

+0

上記のコメントは絶対にありません。私はその部分を修正した。私はコードを実行して別のSIGABRTエラーが発生します:未知の例外 'NSInvalidArgumentException'のためアプリを終了します。理由: '*** -CGColorはUIColor に定義されていません。これは、私が既に保存した色を読み込もうとしたときに発生します。ヘルプPls –

+0

ところで@Stacksza "colorData"を "archivedDataWithRootObject(slitherColor)"に置き換えました –

0

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

とに色を取得するコード:

はにあなたの節約のコードを変更し

データオブジェクトを保存して保存することができます。

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

をして取り戻すために:保存するには

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

Hereは、データを保存および取得するのに役立ちますNSUserDefautlsに拡張したものです。私はここにコードをコピーします。要点ファイルが削除された場合、私たちはまだ有効な情報を持っています。

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

} 

あなたは色のキーuserDefaults.colorForKey(key)

スウィフト3.0取得するには、カラーuserDefaults.setColor(color: color, forKey key: key)

  • を保存設定するには

    1. このメソッドを呼び出すことができます。

      拡張UserDefaults {

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

      使用法:

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

    もっと具体的になることができますか?(例のデータとオブジェクトの使用) –

    +0

    ユーザーのデフォルトでは、すべてのカスタムオブジェクトを保存できないため、NSDataにアーカイブしてオブジェクトとして保存する必要があります。私はこのexntensionをコピーし、これらのメソッドを使用することをお勧めします、それはすべてのものの世話をします。 –

    +0

    @AndyLebo私はswift 3.0のアップデートの回答もあります。ペーストの拡張子をコピーし、キーのメソッドに設定された色と色を使用します。 –

    関連する問題