2016-08-24 10 views
0

私はSwiftで開発中です。私はnsuserdefaults経由でカスタムデータを保存したいと思います。nsuserdefaults経由でカスタムデータを迅速に保存する方法は?

マイカスタムデータは私が、私はデータを保存しようとするとViewController.swift

var userDefault = NSUserDefaults.standardUserDefaults() 
var ConnDevice:[ConnectedDevice] = [ConnectedDevice]() 

でConnectedDevice.swift

import UIKit 
import Foundation 


class ConnectedDevice { 

    var name:String? 

    var ConnectState:Bool=false 

    var AlertState:Int=0 

    var Battery:NSInteger=0 

    var AlertStatus:Int! 

} 

を、以下のようなものです次のコードを使用してください:

userDefault.setValue(ConnDevice, forKey: "ConnectedDevice") 
userDefault.synchronize() 

私はデータをロードしようとすると、私は次のコードを使用し

var test = userDefault.objectForKey("ConnectedDevice") 
if((test) != nil){ 
    ConnDevice = test as! [ConnectedDevice] 
} 

をしかし、私はnsuserdefaultsを介してデータを保存しようとすると、それは次のようなエラーログを表示します。データ型が無効であるようです。

2016-08-24 17:17:50.315 Anti-Lost[471:212884] Attempt to set a non-property-list object (
    "Anti_Lost.ConnectedDevice" 
) as an NSUserDefaults/CFPreferences value for key ConnectedDevice 
2016-08-24 17:17:50.318 Anti-Lost[471:212884] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object (
    "Anti_Lost.ConnectedDevice" 
) for key ConnectedDevice' 

私に何か不足していますか? nsuserdefaultsでカスタムデータを迅速に保存する方法は? ----------------------------------編集-------------

でConnectedDevice.swift

import UIKit 
import Foundation 
import CoreBluetooth 
import CoreLocation 

class ConnectedDevice : NSObject , NSCoding{ 

    var RSSI_threshold:NSNumber=0 

    var Current_RSSI:NSNumber=0 

    var name:String? 

    var bdAddr:NSUUID? 

    var ConnectState:Bool=false 

    var AlertState:Int=0 

    var BLEPeripheral : CBPeripheral! 

    var DisconnectAddress:[String] = [String]() 

    var DisconnectTime:[String] = [String]() 

    var Battery:NSInteger=0 

    var Location:[CLLocation] = [CLLocation]() 

    var AlertStatus:Int! 



    func encodeWithCoder(aCoder: NSCoder) { 

     aCoder.encodeObject(RSSI_threshold, forKey: "RSSI_threshold") 
     aCoder.encodeObject(Current_RSSI, forKey: "Current_RSSI") 
     aCoder.encodeObject(name, forKey: "name") 
     aCoder.encodeObject(bdAddr, forKey: "bdAddr") 
     aCoder.encodeBool(ConnectState, forKey: "ConnectState") 
     aCoder.encodeInteger(AlertState, forKey: "AlertState") 
     aCoder.encodeObject(BLEPeripheral, forKey: "BLEPeripheral") 
     aCoder.encodeObject(DisconnectAddress, forKey: "DisconnectAddress") 
     aCoder.encodeObject(DisconnectTime, forKey: "DisconnectTime") 
     aCoder.encodeObject(Battery, forKey: "Battery") 
     aCoder.encodeObject(Location, forKey: "Location") 
     aCoder.encodeObject(AlertStatus, forKey: "AlertStatus") 


    } 

    override init() { 


    } 

    required init?(coder aDecoder: NSCoder) { 

     self.RSSI_threshold = aDecoder.decodeObjectForKey("RSSI_threshold") as! NSNumber 
     self.Current_RSSI = aDecoder.decodeObjectForKey("Current_RSSI") as! NSNumber 
     self.name = aDecoder.decodeObjectForKey("name") as? String 
     self.bdAddr = aDecoder.decodeObjectForKey("bdAddr") as? NSUUID 
     self.ConnectState = aDecoder.decodeObjectForKey("ConnectState") as! Bool 
     self.AlertState = aDecoder.decodeObjectForKey("AlertState") as! Int 
     self.BLEPeripheral = aDecoder.decodeObjectForKey("BLEPeripheral") as! CBPeripheral 
     self.DisconnectAddress = aDecoder.decodeObjectForKey("DisconnectAddress") as! [String] 
     self.DisconnectTime = aDecoder.decodeObjectForKey("DisconnectTime") as! [String] 
     self.Battery = aDecoder.decodeObjectForKey("Battery") as! NSInteger 
     self.Location = aDecoder.decodeObjectForKey("Location") as! [CLLocation] 
     self.AlertStatus = aDecoder.decodeObjectForKey("AlertStatus") as! Int 
    } 
} 

:--------------------

私は、次のようにコードを変更しますそして、私は次のコードを使用してデータを格納します。

let data = NSKeyedArchiver.archivedDataWithRootObject(ConnectedDevice) 
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "ConnectedDevice") 

しかし、それはaCoder.encodeObject(BLEPeripheral, forKey: "BLEPeripheral")でエラーが表示され、エラーログがCBPeripheralをエンコードする方法

2016-08-24 18:37:57.022 Anti-Lost[476:222607] -[CBPeripheral encodeWithCoder:]: unrecognized selector sent to instance 0x14e9fc60 
2016-08-24 18:37:57.024 Anti-Lost[476:222607] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CBPeripheral encodeWithCoder:]: unrecognized selector sent to instance 0x14e9fc60' 

のですか?

+0

userDefault.setObject(ConnDevice, forKey: "ConnectedDevice")を試してみてください'NSKeyedArchiver'を使用してください。 – Larme

+0

[NSUserDefaultsにカスタムオブジェクトを格納する方法]の複製があります。(http://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults) –

答えて

2

あなたのクラスは、ここでは、NSCodingプロトコルに準拠する必要があります私のアプリのいずれかから、小さなサンプルです:

class BarData: NSObject, NSCoding { 
    let url: String 
    let date: NSDate 
    var isFavorite: Bool = false 

    init(url: String, date: NSDate) { 
     self.url = url 
     self.date = date 
    } 

    //MARK: - NSCoding - 
    @objc required init(coder aDecoder: NSCoder) { 
     url = aDecoder.decodeObjectForKey("url") as! String 
     date = aDecoder.decodeObjectForKey("date") as! NSDate 
     isFavorite = aDecoder.decodeBoolForKey("isFavorite") 
    } 

    @objc func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(url, forKey: "url") 
     aCoder.encodeObject(date, forKey: "date") 
     aCoder.encodeBool(isFavorite, forKey: "isFavorite") 
    } 
} 
+0

こんにちは、コードを修正しました。しかし、それは他のエラーがあります。それはCBPeripheralをエンコードすることができないようです... – Wun

+0

@Wun CBPeripheralはNSCoding準拠でなければならず、再帰的にNSCodingに準拠していないため – HaneTV

1

はあなたがNSCoding` `と` ConnectedDevice`対応にする必要がある代わりにuserDefault.setValue(ConnDevice, forKey: "ConnectedDevice")

関連する問題