2013-11-22 2 views
4

은 내가 여러 휴대폰과의 접촉 (모두가 '모바일'표시)가peoplePickerNavigationController : shouldContinueAfterSelectingPerson : 부동산 : 식별자 :

ABMultiValueRef phones = ABRecordCopyValue(person, property); 
CFStringRef phoneNumber = ABMultiValueCopyValueAtIndex(phones, identifier); 

와 휴대 전화 번호를 선택 얻을 노력하고 있어요. 내가 처음 하나를 선택하면, PHONENUMBER 나에게 첫 번째를 제공하지만, 내가 어떤 연속적인 하나를 선택하면, PHONENUMBER 나에게 이전 번호를 제공합니다

연락처 : 제이 Jaymes 모바일 1,111,111,111 모바일 2,222,222,222 모바일 3333333333을

탭 첫번째, phoneNumber = 1,111,111,111

탭 번째, phoneNumber = 1,111,111,111

탭 세번째,,259,919,321 0 = +2222222222

+0

어떻게 선택합니까? 그 코드를 붙여 넣을 수 있습니까? 그것은 tableview 및 어떻게 그들을 세포에 매핑합니다. –

+0

"전화"는 무엇입니까? –

+0

Grzegorz, 답변 중 하나를 참조하십시오. – user3003787

답변

4

이것은 내가 사용하는 코드입니다. 당신은 ABMultiValueCopyValueAtIndex 내의 인덱스로 identifier를 사용해서는 안

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier 
{ 
    if (property == kABPersonPhoneProperty) 
    { 
     ABMultiValueRef phones = ABRecordCopyValue(person, property); 
     CFStringRef phoneNumber = ABMultiValueCopyValueAtIndex(phones, identifier); 
     NSLog(@"%@", phoneNumber); 
     NSMutableString *tmp = [NSMutableString stringWithFormat:@"%@", (__bridge_transfer NSString *)phoneNumber]; 
     NSString *strippedPhoneNumber = [tmp stringByReplacingOccurrencesOfString:@" " withString:@""]; 
     NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"()-"]; 
     strippedPhoneNumber = [[strippedPhoneNumber componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""]; 
     NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
     [peoplePicker dismissViewControllerAnimated:YES completion:nil]; 
     return NO; 
} 
+0

그게 바로 내가하고있는 일입니다. __bridge_transfer를 제외하고 저는 __bridge만을 사용하고 있습니다.하지만 그 변경 사항은 의심 스럽습니다. 그것은 예상대로 작동하기 시작했습니다 (최소한 시뮬레이터에서). – user3003787

+1

@ user3003787'__bridge_transfer'를 사용하면 ARC가이 객체를 공개 처리합니다. '__bridge'를 사용한다면 수동으로 객체를'CFRelease'해야합니다. 그렇지 않으면 누출 될 것입니다. 정적 분석기 (Xcode의 "Product"메뉴에서 "Analyze")를 통해 코드를 실행하면 이러한 종류의 문제를 쉽게 식별 할 수 있습니다. – Rob

+0

@Rob 이것은 전화 번호를 검색하는 방법의 예입니다. 숫자가 잘못된 경우가 많이있을 수 있습니다. 이 경우 '정규식'을 넣어서 확인할 수 있습니다. –

0

이렇게 쉽게 반복 할 수 있습니다. NSLoging 코드가 작동하는지 확인하십시오. "선택"논리에 몇 가지 버그가 있다고 생각합니다.

ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty); 

for (CFIndex i=0; i < ABMultiValueGetCount(phones); i++) 
{ 
    NSString* phoneLabel = (NSString*)ABMultiValueCopyLabelAtIndex(phones, i); 
    NSString* phoneNumber = ABMultiValueCopyValueAtIndex(phones, i); 

    //release variables since you were using COPY !!! 
    CFRelease(phoneNumber); 
    CFRelease(phoneLabel); 
} 

CFRelease(phones); 
0

까지 종료를 제공 할 것입니다.

ABMultiValueRef phones = ABRecordCopyValue(person, property); 
CFIndex index = ABMultiValueGetIndexForIdentifier(phones, identifier); 
NSString *phoneNumber = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, index)); 
CFRelease(phones); 

일반적으로, ABMultiValueIdentifier 값이 ABMultiValueGetIndexForIdentifier에 의해 검색된 CFIndex 값과 일치하지만, 접촉이 편집 된 경우 (이전 전화 번호의 구체적 경우에 하나가 있었다 : 당신은 CFIndex 인덱스에 ABMultiValueIdentifier 식별자를 변환 ABMultiValueGetIndexForIdentifier를 호출해야합니다 삭제됨) ABMultiValueCopyValueAtIndexABMultiValueIdentifier을 사용하면 잘못된 레코드가 반환됩니다.

+0

두 가지 문제점 : 첫째,'ABMultiValueCopyValueAtIndex'에서'identifier'를 사용해서는 안됩니다. 먼저 'identifier'에서 'ABMultiValueGetIndexForIdentifier'를 사용하여 인덱스를 가져 와서 'ABInputx'를'ABMultiValueCopyValueAtIndex '에 사용해야합니다. 둘째,'CFRelease (phones)'을 수행하지 않으므로 누출됩니다.정적 분석기 (Xcode "Product"메뉴의 "Analyze")를 통해이를 실행하면 이러한 문제를 파악하는 데 상당히 도움이됩니다. – Rob

0

: 그리고 그것은이 방법을 구현하는 올바른 전화 번호 만

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { 

     if (property == kABPersonPhoneProperty) { 

      ABMultiValueRef phoneProperty = ABRecordCopyValue(person,property); 
      CFIndex peopleIndex = ABMultiValueGetIndexForIdentifier(property, identifier); 
      NSString *phone = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneProperty, peopleIndex); 

      [self dismissModalViewControllerAnimated:YES]; 
     } 
    return NO; 
}