我想在地址簿中删除一个ABPerson(比如说,人),然后再添加一个(比如new),因为属性的某些部分可能会被重用,我想克隆'person'到'new',这是我的问题,似乎没有做这个克隆的功能,我发现ABRecordCreateCopy,但它似乎是MAC指定的,有没有我可以用来避免每个属性逐一复制的API? 在此先感谢!iPhone开发 - 可以克隆ABRecord?
杰夫
我想在地址簿中删除一个ABPerson(比如说,人),然后再添加一个(比如new),因为属性的某些部分可能会被重用,我想克隆'person'到'new',这是我的问题,似乎没有做这个克隆的功能,我发现ABRecordCreateCopy,但它似乎是MAC指定的,有没有我可以用来避免每个属性逐一复制的API? 在此先感谢!iPhone开发 - 可以克隆ABRecord?
杰夫
我只是做了一些交叉阅读,似乎没有这样的复制功能。 但有一些关于该主题的要点: 您不必逐个复制值,至少可以使用ABRecordCopyCompositeName
,您可以一次复制前缀,后缀,组织,名字和姓氏。
但是,如果只能使用现有记录的某些部分,为何不将现有记录中不需要的值设置为空或覆盖需要用新值更改的值。由于您只能使用现有人员的某些部分,即使您可以使用ABRecordCreateCopy
,也必须执行此操作。而且,既然你删除了旧的人,我不知道你为什么要删除,而不是只是改变它。 关键是,就我所见,唯一的变化是ABPhoneBook
中的ID不同。我无法想象一个情况,这是一个问题,所有其他值都可以改变。
您可以编写自己的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);
}