如何从地址簿ios以编程方式编辑电话号码值

时间:2013-04-28 00:26:38

标签: iphone ios objective-c addressbook

我正尝试在iOS中以编程方式替换特定联系人的特定电话号码,并使用联系人表格地址簿。

我不知道为什么我无法保存新的电话号码并刷新地址簿以显示更改。

我这样做:

+(BOOL) changeContactPhoneNumber:(NSString *) phoneSought
              forThis:(NSString *) newPhoneNumber{

ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef contactSelected;
CFStringRef mobileLabelNumber;
CFErrorRef error = nil;

// Do whatever you want here.
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

for (int i = 0; i < nPeople; i++)
{

    ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);

    ABMultiValueRef phones = (ABMultiValueRef)ABRecordCopyValue(ref, kABPersonPhoneProperty);
    NSString* mobilePhoneNumber=@"";


    if (ABMultiValueGetCount(phones) > 0) {
        for (int i=0; i < ABMultiValueGetCount(phones); i++) {
            [mobilePhoneNumber release];
            mobilePhoneNumber = (NSString*)ABMultiValueCopyValueAtIndex(phones, i);

            if([mobilePhoneNumber isEqualToString:phoneSought]){
                contactSelected = ref;
                mobileLabelNumber = ABMultiValueCopyLabelAtIndex(phones, i);
            }
        }
    }
}

ABMutableMultiValueRef phoneNumberMultiValue = ABMultiValueCreateMutable(kABPersonPhoneProperty);
bool didAddPhone = ABMultiValueAddValueAndLabel(phoneNumberMultiValue ,(__bridge CFTypeRef)newPhoneNumber,mobileLabelNumber, NULL);


if(didAddPhone){
    ABRecordSetValue(ABAddressBookGetPersonWithRecordID(addressBook, contactSelected),
                     kABPersonPhoneProperty,
                     phoneNumberMultiValue,
                     nil);

    bool bSuccess = ABAddressBookSave(addressBook, &error);
    if (!bSuccess) {
        NSLog(@"Could not save to address book: %@", error);
    } else {
        return YES;
    }

} else {
    NSLog(@"Error editing phone number: %@", error);
    error = nil;
}

return NO;
}

1 个答案:

答案 0 :(得分:3)

您应调试代码并尝试确定您为方法提供的电话号码格式是否匹配。

例如当我记录我的联系人列表电话号码时,这些是结果

Number...555-478-7672
Number...(408) 439-5270
Number...(408) 555-3514
Number...888-555-5512
Number...888-555-1212
Number...555-522-8243
Number...(555) 766-4823
Number...(707) 555-1854
Number...555-610-6679

我正在将这些数字与未格式化的数字字符串进行比较。

其次

ABRecordSetValue(ABAddressBookGetPersonWithRecordID(addressBook, contactSelected),
                 kABPersonPhoneProperty,
                 phoneNumberMultiValue,
                 nil);

谁的实际声明是

ABRecordSetValue(ABRecordRef record, ABPropertyID property, CFTypeRef value, CFErrorRef* error); 

虽然ABAddressBookGetPersonWithRecordID会返回ABRecordRef,但您已经ABRecordRef contactSelected;,所以在我的视图中您应该使用

ABRecordSetValue(contactSelected,kABPersonPhoneProperty,phoneNumberMultiValue,nil);

如果我错了或误解了你的代码,请纠正我!