11

私の iPhone アプリには、特定の連絡先への参照として機能するContactで構成されると呼ばれるクラスがあります。ABRecordRef

これらの連絡先のグループを に保存する必要がありますが、 はカスタム クラスであるNSUserDefaultsため、うまくいきません。Contact

この場合、何をすべきかについてのアイデアはありますか?

4

4 に答える 4

30

NSUserDefaultsカスタムクラスには使用できません。ドキュメントから:

このNSUserDefaultsクラスは、float、double、integer、Boolean、URL などの一般的な型にアクセスするための便利なメソッドを提供します。デフォルト オブジェクトは、プロパティ リスト、つまり、 、 、 、 、 、または のインスタンス (またはコレクションの場合はインスタンスの組み合わせ) でNSDataあるNSString必要 NSNumberNSDateあり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 つのことを行うことができます。

  1. ABRecordまでにsidを入手してABRecordGetRecordID()ください。はABRecordIDint32_t として定義されているため、にキャストしてNSInteger好きな場所に保存できます。ABAddressBookGetPersonWithRecordID()後でまたはからレコードを取得できますABAddressBookGetGroupWithRecordID()。ただし、レコードはその間にユーザーまたは別のアプリによって変更または削除される可能性があります。

  2. レコード内のすべての値を標準のNSObjectサブクラスにコピーし、NSCoding上記で説明したように使用して保存します。もちろん、ユーザーが行った可能性のあるレコードへの変更や追加から利益を得ることはできません。

于 2011-07-14T16:31:16.367 に答える
2

さて、Appleの推奨は、レコード識別子、名、および姓を保存することです。次に、名簿からIDで連絡先を取得してみてください。レコードが見つからない場合、または適切な人物でない場合は、姓名で取得してみてください(レコードIDは、ソースによって変更される可能性があるため)名簿データ)。

これは、データを保存する理由に応じて、必要な場合とそうでない場合があります。ただし、これら3つの値をNSDictionaryに入れて、辞書をに書き込むことは非常に簡単ですNSUserDefaults

于 2011-07-14T16:58:55.277 に答える
1

ABRecordRefはのように見えるconst void *ので、に保存します。 :NSUserDefaultsでラップする必要があります。NSDataNSData *d = [[NSData alloc] initWithBytes:thePointer length:sizeof(ABRecordRef)];

于 2011-07-14T16:43:25.287 に答える