2014-04-14 2 views
1
내가

주소록 - 링크 접촉

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { 
     if (property==kABPersonEmailProperty) { 
      ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); 
      if (ABMultiValueGetCount(emails) > 0) { 
       NSString *email = (__bridge_transfer NSString*) 
       ABMultiValueCopyValueAtIndex(emails, ABMultiValueGetIndexForIdentifier(emails,identifier)); 
       [recipientEmail setText:email]; 
       [peoplePicker dismissViewControllerAnimated:YES completion:nil]; 
      } 
      CFRelease(emails); 
     } 
     return NO; 
    } 

아래에 언급 대리인 콜백에서 선택한 이메일 속성을 가져 오기 위해 노력하지만 링크 된 연락처의 전자 메일 속성을 선택하는 경우 (하나의 이메일을 갖는)하고

의 선택 이메일 나는 식별자를 얻을 0으로 결과적으로 기본 연락처의 첫 번째 전자 메일 ID를 얻습니다. 예 : - [email protected] [email protected] 로저 (링크 연락) - 존 [email protected]

내가 [email protected]를 선택 나는 [email protected]를 얻을.

답변

0

동일한 문제가 있습니다. 여러 전자 메일 주소로 계정을 선택하면 잘못된 전자 메일이 발송됩니다. 선택한 ABMutableMultiValueRef을 통해 내가 루프 ...

for (CFIndex ix = 0; ix < ABMultiValueGetCount(emails); ix++) { 
    CFStringRef label = ABMultiValueCopyLabelAtIndex(emails, ix); 
    CFStringRef value = ABMultiValueCopyValueAtIndex(emails, ix); 
    NSLog(@"I have a %@ address: %@", label, value); 
    if (label) CFRelease(label); 
    if (value) CFRelease(value); 
} 

... 나는 여러 같은 주소의 발생하지만, 널 (null) 레이블 일부를 얻을 때. 내가하려고합니다

> I have a (null) address: [email protected] 
> I have a _$!<Work>!$_ address: [email protected] 
> I have a _$!<Home>!$_ address: [email protected] 

해결 방법은, 먼저 널 라벨을 필터링하려면 ABMultiValueIdentifier '맞는'있는지, 그리고 널 라벨에 복귀하지 않을 경우입니다. 뭔가 찾지 않았다면?

편집 :이 작품은 나를 위해.

NSMutableArray *labeled = [NSMutableArray new]; 
    ABMutableMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); 
    for (CFIndex ix = 0; ix < ABMultiValueGetCount(emails); ix++) { 
     CFStringRef label = ABMultiValueCopyLabelAtIndex(emails, ix); 
     CFStringRef value = ABMultiValueCopyValueAtIndex(emails, ix); 
     if (label != NULL) { 
      [labeled addObject:(NSString *)CFBridgingRelease(value)]; 
     } 
     if (label) CFRelease(label); 
     if (value) CFRelease(value); 
    } 
    NSString *email; 
    if (labeled.count > identifier) { 
     email = [labeled objectAtIndex:identifier]; 
    } else { 
     CFStringRef emailRef = ABMultiValueCopyValueAtIndex(emails, identifier); 
     email = (NSString *)CFBridgingRelease(emailRef); 
    }