выберите контакт из адресной книги 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 4

1 ответ:

ABRecordSetValue() устанавливает свойство записи в значение, которое вы ему задаете, перезаписывая любое существующее значение для указанного свойства. Поскольку вы используете ABMultiValueCreateMutable() для создания нового пустого списка значений, вы фактически игнорируете любые значения kABPersonPhoneProperty, которые могут уже существовать в ABRecord.

Вместо этого процесс редактирования существующей записи должен быть следующим:

  • вызовите ABRecordCopyValue() для выбранной записи, чтобы получить существующий список значений
  • вызов ABMultiValueCreateMutableCopy() для получения списка изменяемых значений
  • добавить желаемый номер телефона в список изменяемых значений с ABMultiValueAddValueAndLabel()
  • запишите список изменяемых значений с добавлением номера телефона обратно в запись с помощью ABRecordSetValue()