アドレス帳の 1 つの ABPerson (たとえば、人) を削除してから、別のもの (たとえば、新規) を追加します。属性の一部が再利用される可能性があるため、「人」を「新規」に複製したいと考えています。これが私の質問です。このクローンを実行する関数はないようです。ABRecordCreateCopy を見つけましたが、MAC が指定されているようです。各プロパティを 1 つずつコピーするのを避けるために使用できる API はありますか? 前もって感謝します!
ジェフ
ABRecordCreateCopy
vCard 表現を生成して の独自のバージョンを記述し、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);
}
クロスリーディングを行ったところ、そのようなコピー機能はないようです。ただし、このトピックにはいくつかのポイントがあります。値を 1 つずつコピーする必要はありません。少なくとも、ABRecordCopyCompositeName
プレフィックス、サフィックス、組織、名、および姓を一度にコピーできます。
ただし、既存のレコードの一部しか使用できない場合は、既存のレコードの不要な値を null に設定するか、変更が必要な値を新しい値で上書きしないでください。既存の人物の一部しか使用できないため、使用できる場合でもこれを行う必要がありますABRecordCreateCopy
。とにかく古い人を削除するので、そもそも変更するだけでなく、なぜ削除したいのかわかりません。ポイントは、私が見る限り、そうすることでの唯一の変更は、ABPhoneBook
. これが問題になり、他のすべての値を変更できる状況は想像できません。