1

アドレス帳の 1 つの ABPerson (たとえば、人) を削除してから、別のもの (たとえば、新規) を追加します。属性の一部が再利用される可能性があるため、「人」を「新規」に複製したいと考えています。これが私の質問です。このクローンを実行する関数はないようです。ABRecordCreateCopy を見つけましたが、MAC が指定されているようです。各プロパティを 1 つずつコピーするのを避けるために使用できる API はありますか? 前もって感謝します!

ジェフ

4

2 に答える 2

1

ABRecordCreateCopyvCard 表現を生成して の独自のバージョンを記述し、ABRecordそこから を作成できます。以下はコード スニペットです。返されたインスタンスが使用されなくなったら、忘れずに解放してください。

ABRecordRef ABRecordCreateCopy (ABRecordRef record)
{
    ABRecordRef people[1] = {record};
    CFArrayRef peopleArray = CFArrayCreate(NULL, people, 1, &kCFTypeArrayCallBacks);
    CFDataRef vCardData = ABPersonCreateVCardRepresentationWithPeople(peopleArray);
    ABRecordRef source = ABPersonCopySource(record);
    ABRecordRef duplicatedPerson = ABPersonCreatePeopleInSourceWithVCardRepresentation(source, vCardData);
    ABRecordRef returnedPerson = CFArrayGetValueAtIndex(duplicatedPerson, 0);

    CFRelease(source);
    CFRelease(vCardData);
    CFRelease(duplicatedPerson);

    return CFRetain(returnedPerson);
}
于 2013-08-18T07:12:54.213 に答える
0

クロスリーディングを行ったところ、そのようなコピー機能はないようです。ただし、このトピックにはいくつかのポイントがあります。値を 1 つずつコピーする必要はありません。少なくとも、ABRecordCopyCompositeNameプレフィックス、サフィックス、組織、名、および姓を一度にコピーできます。

ただし、既存のレコードの一部しか使用できない場合は、既存のレコードの不要な値を null に設定するか、変更が必要な値を新しい値で上書きしないでください。既存の人物の一部しか使用できないため、使用できる場合でもこれを行う必要がありますABRecordCreateCopy。とにかく古い人を削除するので、そもそも変更するだけでなく、なぜ削除したいのかわかりません。ポイントは、私が見る限り、そうすることでの唯一の変更は、ABPhoneBook. これが問題になり、他のすべての値を変更できる状況は想像できません。

于 2011-08-22T20:30:15.367 に答える