2013-07-26 5 views
0

Все телефонные номера, хранящиеся в адресной книге, имеют ярлык: «домашний», «рабочий», «домашний факс» и т. Д. Мне нужно изменить ярлык конкретный контакт, помещающий пользовательский ярлык с именем «ATM».Попытка обновить номер телефона с номером телефона в адресной книге

Я получил сообщение об ошибке:

"Assertion failed: (((ABCMultiValue *)multiValue)->flags.isMutable), function ABMultiValueReplaceLabelAtIndex, file /SourceCache/AddressBook_Sim/AddressBook-796.6/ABMultiValue.c, line 118." 

Это мой код, есть комментарий, где я получил excepton:

- (void)displayPerson:(ABRecordRef)person { 
    NSString* name = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
    self.firstName.text = name; 
    NSString* phone = nil; 
    NSString* lbl = nil; 
    NSString* newLbl = @"ATM"; 

    ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, 
               kABPersonPhoneProperty); 
    if (ABMultiValueGetCount(phoneNumbers) > 0) { 
     phone = (__bridge_transfer NSString*) 
     ABMultiValueCopyValueAtIndex(phoneNumbers, 0); 

     lbl = (__bridge_transfer NSString*) 
     ABMultiValueCopyLabelAtIndex(phoneNumbers, 0); 

     //*** HERE IS THE PROBLEM *** 
     ABMultiValueReplaceLabelAtIndex(phoneNumbers, CFSTR("ATM"), 0); 

     NSLog(@" - %@ (%@)", phone, lbl); 
    } else { 
     phone = @"[None]"; 
     lbl = @"[None]"; 
     newLbl = @"[None]"; 
    } 

    CFRelease(phoneNumbers); 
} 

Как я могу изменить название этого номер телефона?

+0

Люди, просто дополнить мой метод "displayPerson" вышел из этого примера : http://developer.apple.com/library/ios/#documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/Chapters/QuickStart.html –

ответ

2

Я нашел решение: ниже код работает отлично:

- (void)displayPerson:(ABRecordRef)person 

{

ABAddressBookRef ab = ABAddressBookCreate(); 
ABRecordRef record = ABAddressBookGetPersonWithRecordID(ab, ABRecordGetRecordID(person)); 
CFErrorRef *error = NULL; 

ABMultiValueRef phoneNumbers = ABRecordCopyValue(record,kABPersonPhoneProperty); 
ABMutableMultiValueRef phoneNumberMV = ABMultiValueCreateMutableCopy(phoneNumbers); 


for(CFIndex i=0; i < ABMultiValueGetCount(phoneNumberMV); i++){ 
    NSString *phoneNumber = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phoneNumberMV,i); 
    //NSSlog(@"phoneNumber = %@", phoneNumber); 

    if ([@"1128558994" isEqualToString:phoneNumber]) { 
     //now delete it!!! ;-) 
     /* 
     NSSlog(@"phoneNumbers = %@",phoneNumbers); 
     NSSlog(@"index = %d", i); 
     */ 

     //BOOL didRemove = ABMultiValueRemoveValueAndLabelAtIndex(phoneNumberMV,i); 

     BOOL didChanged = ABMultiValueReplaceLabelAtIndex(phoneNumberMV, (CFStringRef)@"0870", i); 
     NSLog(@"didRemove = %@\n", (didChanged ? @"TRUE" : @"FALSE")); 

     BOOL didSet = ABRecordSetValue(record, kABPersonPhoneProperty, phoneNumberMV, nil); 
     NSLog(@"didSet = %@\n", (didSet ? @"TRUE" : @"FALSE")); 

     //and save it! 
     BOOL didSave = ABAddressBookSave(ab, (CFErrorRef *) error); 

     NSLog(@"didSave = %@\n", (didSave ? @"TRUE" : @"FALSE")); 
     if (error) { 
      NSLog(@"ABAddressBookSaveError = %@", error); 
     } 
    } 
} 
CFRelease(ab); 

}

Смежные вопросы