4

私のシナリオは、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...");

  }

}

このコードは完全に機能します。

そして、次のコードを使用して連絡先を取得し、テキスト フィールドに表示します。

-(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;

}

問題は、この番号のみが連絡先に追加され、他のすべての既存のエントリが削除されることです。つまり、この番号は他のすべての既存のエントリを上書きします。助けてください

4

1 に答える 1

4

ABRecordSetValue() レコードのプロパティを指定した値に設定し、そのプロパティの既存の値を上書きします。を使用ABMultiValueCreateMutable()して新しい空の値リストを作成しているため、kABPersonPhonePropertyに既に存在する可能性のある の値は事実上無視されABRecordます。

代わりに、既存のレコードを編集するプロセスは次のようにする必要があります。

  • 選択したレコードを呼び出しABRecordCopyValue()て、既存の値リストを取得します
  • ABMultiValueCreateMutableCopy()変更可能な値リストを取得するために呼び出します
  • 目的の電話番号を可変値リストに追加しますABMultiValueAddValueAndLabel()
  • 電話番号がレコードに追加された可変値リストを書き込みますABRecordSetValue()
于 2013-02-04T19:56:03.150 に答える