[解決済み】プロパティリスト以外のオブジェクトをNSUserDefaultsとして設定しようとした場合
質問
このエラーの原因はわかっていたつもりですが、何が悪かったのかがわからないようです。
以下は、私が受け取ったエラーメッセージの全文です。
プロパティリスト以外のオブジェクトを設定しようとした ( "<BC_Person: 0x8f3c140>" ) をキーpersonDataArrayのNSUserDefaults値として使用します。
私の場合は
Person
に適合していると思われるクラスです。
NSCoding
プロトコルで、これらのメソッドを person クラスに実装しています。
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:self.personsName forKey:@"BCPersonsName"];
[coder encodeObject:self.personsBills forKey:@"BCPersonsBillsArray"];
}
- (id)initWithCoder:(NSCoder *)coder {
self = [super init];
if (self) {
self.personsName = [coder decodeObjectForKey:@"BCPersonsName"];
self.personsBills = [coder decodeObjectForKey:@"BCPersonsBillsArray"];
}
return self;
}
アプリ内のある時点で
NSString
の中に
BC_PersonClass
が設定されており、私の場合は
DataSave
のプロパティのエンコーディングを処理していると思われるクラスがあります。
BC_PersonClass
.
以下は、私が使用しているコードです。
DataSave
クラスがあります。
- (void)savePersonArrayData:(BC_Person *)personObject
{
// NSLog(@"name of the person %@", personObject.personsName);
[mutableDataArray addObject:personObject];
// set the temp array to the mutableData array
tempMuteArray = [NSMutableArray arrayWithArray:mutableDataArray];
// save the person object as nsData
NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];
// first add the person object to the mutable array
[tempMuteArray addObject:personEncodedObject];
// NSLog(@"Objects in the array %lu", (unsigned long)mutableDataArray.count);
// now we set that data array to the mutable array for saving
dataArray = [[NSArray alloc] initWithArray:mutableDataArray];
//dataArray = [NSArray arrayWithArray:mutableDataArray];
// save the object to NS User Defaults
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
[userData setObject:dataArray forKey:@"personDataArray"];
[userData synchronize];
}
私が何をしようとしているのか、このコードで十分おわかりいただけると思います。 繰り返しますが、私の問題はBC_Personクラスのプロパティをどのようにエンコードしているかにあることは分かっています。
助けてくれてありがとうございます。
解決方法は?
投稿されたコードは、カスタムオブジェクトの配列を
NSUserDefaults
. それはできません。を実装することで
NSCoding
メソッドは役に立ちません。のようなものしか格納できません。
NSArray
,
NSDictionary
,
NSString
,
NSData
,
NSNumber
および
NSDate
で
NSUserDefaults
.
オブジェクトに変換する必要があります。
NSData
(コードの一部にあるように)そして、その
NSData
で
NSUserDefaults
. を格納することもできます。
NSArray
の
NSData
必要であれば
配列を読み出す際には、アーカイブを解除する必要があります。
NSData
を取り戻すために
BC_Person
オブジェクトを作成します。
おそらく、これが欲しいのでしょう。
- (void)savePersonArrayData:(BC_Person *)personObject {
[mutableDataArray addObject:personObject];
NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:mutableDataArray.count];
for (BC_Person *personObject in mutableDataArray) {
NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];
[archiveArray addObject:personEncodedObject];
}
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
[userData setObject:archiveArray forKey:@"personDataArray"];
}
関連
-
[解決済み】Xcode - 'NSUnknownKeyException', reason: ... this class is not key value coding-compliant for the key X" エラーの修正方法とは?
-
[解決済み】Cocoapodsをインストールできない - プロジェクト・ディレクトリにポッドファイルが見つからない
-
[解決済み] Xcodeエラー "Could not find Developer Disk Image" が発生する。
-
[解決済み] EXC_CORPSE_NOTIFY シンボルのクラッシュが発生しました、追跡するには?
-
[解決済み] シミュレータへのサービス接続の開始に失敗しました Xcode
-
[解決済み] Xcode 4のBundle creator OS Type code ?
-
[解決済み] アプリケーションは、アプリケーション起動の最後にルートビューコントローラーを持つことが期待される
-
[解決済み] CFBundleVersionとCFBundleShortVersionStringには、どのような値を使用すればよいですか?
-
[解決済み] あなたのリクエストはエラーを発生させました。[newNullResponse]?
-
[解決済み] iOS Swift 3 - UIDatePicker
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cocoapodsをインストールできない - プロジェクト・ディレクトリにポッドファイルが見つからない
-
[解決済み】"宣言はファイルスコープでのみ有効 "について
-
[解決済み] シミュレーターiOS 13でダークモードを使用するには?
-
[解決済み] Info.plist ユーティリティのエラーです。"そのようなファイルがないため、Info.plistを開くことができませんでした"
-
[解決済み] UICollectionView: 非Nilのレイアウトパラメータで初期化する必要があります。
-
[解決済み] 指定されたホスト名を持つサーバーが見つからなかった
-
[解決済み] SwiftUI vs Interface Builderとストーリーボード【非公開
-
[解決済み] NSIntegerからNSStringデータ型に変換するにはどうすればよいですか?
-
[解決済み] なぜSwiftでUIViewControllerのデフォルトのsuper.init()を呼び出すことができないのでしょうか?
-
[解決済み] Objective C - 値で渡す、参照で渡す