私の iPhone アプリには、特定の連絡先への参照として機能するContact
で構成されると呼ばれるクラスがあります。ABRecordRef
これらの連絡先のグループを に保存する必要がありますが、 はカスタム クラスであるNSUserDefaults
ため、うまくいきません。Contact
この場合、何をすべきかについてのアイデアはありますか?
私の iPhone アプリには、特定の連絡先への参照として機能するContact
で構成されると呼ばれるクラスがあります。ABRecordRef
これらの連絡先のグループを に保存する必要がありますが、 はカスタム クラスであるNSUserDefaults
ため、うまくいきません。Contact
この場合、何をすべきかについてのアイデアはありますか?
NSUserDefaults
カスタムクラスには使用できません。ドキュメントから:
この
NSUserDefaults
クラスは、float、double、integer、Boolean、URL などの一般的な型にアクセスするための便利なメソッドを提供します。デフォルト オブジェクトは、プロパティ リスト、つまり、 、 、 、 、 、または のインスタンス (またはコレクションの場合はインスタンスの組み合わせ) でNSData
あるNSString
必要NSNumber
がNSDate
ありNSArray
ますNSDictionary
。他のタイプのオブジェクトを保存する場合は、通常、アーカイブして のインスタンスを作成する必要がありますNSData
。
を使ってみてくださいNSData
。たとえば、カスタム オブジェクトを配列にロードするには、次のようにします。
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];
if (dataRepresentingSavedArray != nil)
{
NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
if (oldSavedArray != nil)
objectArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
else
objectArray = [[NSMutableArray alloc] init];
}
データをアーカイブするには、次を使用します。
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:objectArray] forKey:@"savedArray"];
NSCoding
カスタムオブジェクトがプロトコルに準拠している限り、これはすべて機能します。
- (void)encodeWithCoder:(NSCoder *)coder;
{
[coder encodeObject:label forKey:@"label"];
[coder encodeInteger:numberID forKey:@"numberID"];
}
- (id)initWithCoder:(NSCoder *)coder;
{
self = [[CustomObject alloc] init];
if (self != nil)
{
label = [coder decodeObjectForKey:@"label"];
numberID = [coder decodeIntegerForKey:@"numberID"];
}
return self;
}
ABRecord
不透明な C 型であるため、Objective-C の意味でのオブジェクトではありません。つまり、拡張することも、カテゴリを追加することも、メッセージを送信することもできません。唯一できることは、ABRecord
リファレンスで説明されている関数ABRecord
を をパラメータとして呼び出すことです。
ABRecord
周囲から参照される情報を保持できるようにするために、次の 2 つのことを行うことができます。
ABRecord
までにsid
を入手してABRecordGetRecordID()
ください。はABRecordID
int32_t として定義されているため、にキャストしてNSInteger
好きな場所に保存できます。ABAddressBookGetPersonWithRecordID()
後でまたはからレコードを取得できますABAddressBookGetGroupWithRecordID()
。ただし、レコードはその間にユーザーまたは別のアプリによって変更または削除される可能性があります。
レコード内のすべての値を標準のNSObject
サブクラスにコピーし、NSCoding
上記で説明したように使用して保存します。もちろん、ユーザーが行った可能性のあるレコードへの変更や追加から利益を得ることはできません。
さて、Appleの推奨は、レコード識別子、名、および姓を保存することです。次に、名簿からIDで連絡先を取得してみてください。レコードが見つからない場合、または適切な人物でない場合は、姓名で取得してみてください(レコードIDは、ソースによって変更される可能性があるため)名簿データ)。
これは、データを保存する理由に応じて、必要な場合とそうでない場合があります。ただし、これら3つの値をNSDictionaryに入れて、辞書をに書き込むことは非常に簡単ですNSUserDefaults
。
ABRecordRefはのように見えるconst void *
ので、に保存します。 :NSUserDefaults
でラップする必要があります。NSData
NSData *d = [[NSData alloc] initWithBytes:thePointer length:sizeof(ABRecordRef)];