0

アドレス帳に保存されているすべての電話番号には、「自宅」、「職場」、「自宅のファックス」などのラベルが付いています。特定の連絡先のラベルを変更して、「ATM」という名前のカスタム ラベルを付ける必要があります。

次のエラー メッセージが表示されました。

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

これは私のコードです。例外が発生した場所にコメントがあります:

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

その電話番号のラベルを変更するにはどうすればよいですか?

4

1 に答える 1

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

}

于 2013-07-31T19:38:48.160 に答える