私がやりたいのは、ユーザーにアドレス帳から番号を選択させることだけです。この質問でコードを見つけました:
アドレス帳の連絡先から電話番号を取得する方法 (iPhone SDK)
ABMultiValueRef container = ABRecordCopyValue(person, property);
CFStringRef contactData = ABMultiValueCopyValueAtIndex(container, identifier);
CFRelease(container);
NSString *contactString = [NSString stringWithString:(NSString *)contactData];
CFRelease(contactData);
問題は、2 行目 (3.0 デバイスで実行している場合) で次のエラーが発生することです。
アカウント マネージャーは、識別子 MobileMe:rustyshelf のアカウントを見つけることができませんでした。
に続く:
プログラムはシグナル「EXC_BAD_ACCESS」を受信しました。
これらはすべてピッカーデリゲートメソッド内にあります。
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
これは、Mobile Meと同期されている私のアドレス帳の連絡先の1つです。
編集: これは SDK のバグかもしれないと思います。一部の連絡先では発生しますが、他の連絡先では発生しません...
ベストアンサー1
「識別子」引数には、タッチされたレコードの CFIndex は保持されません。ユーザーが選択した電話番号を確認するために使用する方法は次のとおりです。
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
if (property == kABPersonPhoneProperty) {
ABMultiValueRef multiPhones = ABRecordCopyValue(person, kABPersonPhoneProperty);
for(CFIndex i = 0; i < ABMultiValueGetCount(multiPhones); i++) {
if(identifier == ABMultiValueGetIdentifierAtIndex (multiPhones, i)) {
CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(multiPhones, i);
CFRelease(multiPhones);
NSString *phoneNumber = (NSString *) phoneNumberRef;
CFRelease(phoneNumberRef);
txtPhoneNumber.text = [NSString stringWithFormat:@"%@", phoneNumber];
[phoneNumber release];
}
}
}
[self dismissModalViewControllerAnimated:YES];
return NO;
}