如何编辑联系人?

时间:2010-01-04 16:59:21

标签: iphone objective-c

有没有办法在iPhone中以编程方式编辑联系人?例如,我想修改ABPeoplePickerNavigationController返回的联系人。我怎样才能做到这一点?我有:

(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
  NSString *phoneNum = @"01234567890";

ABAddressBookRef addressBook = ABAddressBookCreate();
contact = ABAddressBookGetPersonWithRecordID(addressBook, ABRecordGetRecordID(person));

if(phoneNum && contact != NULL)
{
    ABMutableMultiValueRef phoneNumberMultiValue =  ABMultiValueCreateMutable(kABMultiStringPropertyType);
    ABMultiValueAddValueAndLabel(phoneNumberMultiValue, phoneNum,  kABPersonPhoneMobileLabel, NULL);

    [self dismissModalViewControllerAnimated:YES];

    ABRecordSetValue(contact, kABPersonPhoneProperty, phoneNumberMultiValue, nil);
            //THIS CODE IS NOT BEHAVING AS I EXPECTED,
    //if(ABAddressBookHasUnsavedChanges(addressBook))//Anyway this needs to be checked
    {
        ABAddressBookSave(addressBook, NULL);
    }
}
   return NO;

}

ABAddressBookSave(addressBook, NULL);的调用正在进行中。但问题是,“联系人”的所有旧信息都从地址簿中删除,最后只保存了“phoneNum”。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

对前一个答案道歉 - 我读错了这个问题......!我以为联系人根本没有保存在地址簿上。

似乎丢失的唯一信息是联系人的其他电话号码,对吗?这意味着ABRecordRef的其他详细信息(如地址,备注,出生日期等)保持不变。

如果这是正确的,我认为解决其他电话号码删除的唯一可行方法是简单地将PhoneLabel附加到联系人现有的kABPersonPhoneProperty。而不是为电话号码创建新的ABMutableMultiValueRef,而是从记录中复制它,如下所示:

ABMutableMultiValueRef phoneNumberMultiValue = ABMultiValueCreateMutableCopy((ABMultiValueRef)ABRecordCopyValue(contact, kABPersonPhoneProperty));

有了这个,您现在可以使用相同的代码附加新电话号码:

ABMultiValueAddValueAndLabel(phoneNumberMultiValue, phoneNum,  kABPersonPhoneMobileLabel, NULL);

关于这一点的好处是没有更换或删除 - 应用程序只是将另一个电话号码添加到联系人的电话号码属性。 :d

希望这有帮助。

答案 1 :(得分:0)

您应该做的第一件事是将对CFErrorRef的引用作为ABAddressBookSave的第二个参数传递;它可能是因为你试图报告错误,但却无法报告,因为你没有给出这个论点。

答案 2 :(得分:0)

目前无法编辑和保存与地址簿的联系。 IPhone API不支持此要求。为了编辑特定的联系人,我们需要通过记录ID获取该联系人的参考,并将所有信息复制到参考,然后将该联系人保存到地址簿。