выберите контакт из адресной книги iPhone и добавьте в него новый номер телефона
Мой сценарий состоит в том, чтобы выбрать контакт из адресной книги iPhone и отобразить его имя и первый номер телефона в текстовых полях, а затем программно добавить номер телефона в свойстве KABOtherLabel.
Я использую этот код для добавления контакта программно;
-(IBAction)addContactToAddressBook:(id)sender
{
CFErrorRef error = NULL;
ABAddressBookRef iPhoneAddressBook = ABAddressBookCreateWithOptions(NULL, NULL);
ABRecordRef newPerson = ABPersonCreate();
ABRecordSetValue(newPerson, kABPersonFirstNameProperty, (__bridge CFTypeRef)(contactName.text), &error);
ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType);
ABMultiValueAddValueAndLabel(multiPhone, (__bridge CFTypeRef)(phoneNumber.text), kABPersonPhoneMobileLabel, NULL);
ABMultiValueAddValueAndLabel(multiPhone, @"1-123-456-7890", kABPersonPhoneIPhoneLabel, NULL);
ABMultiValueAddValueAndLabel(multiPhone, @"1-987-654-3210", kABOtherLabel, NULL);
ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone,nil);
CFRelease(multiPhone);
ABAddressBookAddRecord(iPhoneAddressBook, newPerson, &error);
ABAddressBookSave(iPhoneAddressBook, &error);
if (error != NULL)
{
NSLog(@"Some error...");
}
}
Этот код работает отлично.
И Im, используя следующий код, чтобы забрать контакт и отобразить его в текстовых полях;
-(IBAction)pickContact:(id)sender
{
ABPeoplePickerNavigationController *picker =
[[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
[self presentViewController:picker animated:YES completion:nil];
}
//called when user presses the cancel button in the Address book view controller
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
[self dismissViewControllerAnimated:YES completion:nil];
}
//called when user pics up a contact from the phone's address book
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person {
[self displayPerson:person]; //calls displayPerson:(ABRecordRef)person to show contact's information in the app
[self dismissViewControllerAnimated:NO completion:NULL];
}
- (void)displayPerson:(ABRecordRef)person
{
NSString* name = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonFirstNameProperty); //Extracts the contact's first name from address book & assigns it to a string value
//NSString* lastName = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonLastNameProperty); //Extracts the contact's last name from address book & assigns it to a string value
self.contactName.text = name;
NSString* phone = nil;
//Extracts the first phone number among multiple contact numbers from address book & assigns it to a string value
ABMultiValueRef phoneNumbers = ABRecordCopyValue(person,kABPersonPhoneProperty);
if (ABMultiValueGetCount(phoneNumbers) > 0)
{
phone = (__bridge_transfer NSString*)
ABMultiValueCopyValueAtIndex(phoneNumbers, 0);
}
else
{
phone = @"[None]";
}
self.phoneNumber.text = phone;
}
Этот код также отлично работает, и я получаю значения в обязательные текстовые поля.
Однако, когда я объединяю эти оба кода, я пишу следующий код в конце метода displayPerson() или вызываю его из shouldContinueAfterSelectingPerson
Код, который я использовал для добавления деталей в существующий контакт, выглядит следующим образом;
CFErrorRef error = NULL;
ABAddressBookRef myAddressBook = ABAddressBookCreateWithOptions(NULL, NULL);
ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType);
ABMultiValueAddValueAndLabel(multiPhone, @"1-987-654-3210", kABPersonPhoneIPhoneLabel, NULL);
ABRecordSetValue(person, kABPersonPhoneProperty, multiPhone,nil);
CFRelease(multiPhone);
ABAddressBookAddRecord(myAddressBook, person, &error);
ABAddressBookSave(myAddressBook, &error);
if (error != NULL)
{
NSLog(@"Some error");
}
return NO;
}
Проблема в том, что в контакт добавляется только этот номер, а все остальные существующие записи удаляются. я-это количество заменяет все другие существующие записи. Пожалуйста, помогите1 ответ:
ABRecordSetValue()
устанавливает свойство записи в значение, которое вы ему задаете, перезаписывая любое существующее значение для указанного свойства. Поскольку вы используетеABMultiValueCreateMutable()
для создания нового пустого списка значений, вы фактически игнорируете любые значенияkABPersonPhoneProperty
, которые могут уже существовать вABRecord
.Вместо этого процесс редактирования существующей записи должен быть следующим:
- вызовите
ABRecordCopyValue()
для выбранной записи, чтобы получить существующий список значений- вызов
ABMultiValueCreateMutableCopy()
для получения списка изменяемых значений- добавить желаемый номер телефона в список изменяемых значений с
ABMultiValueAddValueAndLabel()
- запишите список изменяемых значений с добавлением номера телефона обратно в запись с помощью
ABRecordSetValue()