2017-03-19 7 views
-2

迅速私はuserDefaultsで配列を格納しようとしていますが、私は私のアプリを実行したときに、私はこのエラーを取得しています:NSUserDefaultsに配列を保存するには? 3

「非プロパティリストオブジェクトを挿入しようとする( 「Morning_Star_2.Event(タイトル:オプション(\を"テストタイトル\")、場所:キーテストのオプション(\ "テスト場所\"))」 」)

ここでは私のコードです:

import UIKit 

class ViewController: UIViewController { 


    @IBOutlet weak var txtTitle: UITextField! 

    @IBOutlet weak var txtLocation: UITextField! 

    @IBOutlet weak var txtDate: UITextField! 

    @IBOutlet weak var txtTime: UITextField! 

    var eventsArray = [Event]() 


     @IBAction func btnSave() { 

     let savedEvents = UserDefaults.standard.object(forKey: "test") 

     let event = Event(eventTitle: txtTitle.text!, eventLocation: txtLocation.text!) 

     if let tempEvents = savedEvents { 
      eventsArray = tempEvents as! [Event] 
      eventsArray.append(event) 

     } 
     else { 
      let event = Event(eventTitle: txtTitle.text!, eventLocation: txtLocation.text!) 
      eventsArray.append(event) 
     } 

     UserDefaults.standard.set(eventsArray, forKey: "test") 


     //print(eventsArray) 

     } 

} 
+0

あなたの配列は、ユーザデフォルトに自動的に保存することができないカスタムオブジェクトを持っています

let data = NSKeyedArchiver.archivedData(withRootObject: eventsArray) // This calls the encode function of your Event class UserDefaults.standard.set(data, forKey: "test") /* This saves the object to a buffer, but you will need to call synchronize, before it is actually saved to UserDefaults */ UserDefaults.standard.synchronize() 

あなたはそれがどれ?、あなたのオブジェクトにキャストする必要がありますどのよう戻ってくるデータを取得

。それを正しく行う方法をここで見てください:https://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults – DisableR

+1

[エラーで検索してください](http:// stackoverflow。 com/search?q =%5Bswift%5D +試行+から+挿入+非プロパティ+リスト+オブジェクト)。 – rmaddy

+0

オブジェクトをUserDefaultsに直接格納することはできません。したがって、このタイプのエラーが発生します。 –

答えて

0

UserDefaultsでカスタムオブジェクトを格納するには、お使いのオブジェクトは

class Event: NSObject, NSCoding { 

    private var eventTitle: String! 
    private var eventLocation: String! 

    init(eventTitle: String, eventLocation: String) { 
     self.eventTitle = eventTitle 
     self.eventLocation = eventLocation 
    } 

    override init() { 

    } 

    required convenience init?(coder aDecoder: NSCoder) { 
     self.init() 
     eventTitle = aDecoder.decodeObject(forKey: "eventTitle") as? String 
     eventLocation = aDecoder.decodeObject(forKey: "eventLocation") as? String 
    } 

    func encode(with aCoder: NSCoder) { 
     aCoder.encode(eventTitle, forKey: "eventTitle") 
     aCoder.encode(eventLocation, forKey: "eventLocation") 
    } 

} 

、あなただけのUserDefaultsで特定のオブジェクトを格納することができます:NSObjectのから

  1. 継承
  2. は、クラスの実装の例は次のようになります

NSCodingプロトコルに準拠します。幸いなことに、Data型はUserDefaultsに格納できます。次に、配列をDataに変換して保存する必要があります。

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