2012-08-17 1 views
2

내가하려는 것은 사람 선택기를 사용자에게 보여주고, 그가 원하는 모든 연락처를 선택하게하고, 결국 모든 연락처의 이메일 주소를 배열로 가져 오는 것입니다. 최상의 방법은 사용자에게 전자 메일로만 연락처를 표시하는 것입니다.iOS 선택된 연락처의 이메일 주소를 배열로 가져 오기

지금까지 나는 사람들이이 코드를 선택기 제시 할 수 있었던 유일한 : 다음

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; 
    picker.peoplePickerDelegate = self; 
    [self presentModalViewController:picker animated:YES]; 

내가 선택한 연락처의 이메일을이 코드를 사용하려고 시도했다 :

- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { 

ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty); 
[email addObject:(__bridge NSString*)ABMultiValueCopyValueAtIndex(multi, 0)]; 
[self dismissModalViewControllerAnimated:YES]; 

return YES; 
} 

하지만 연락처를 선택하자마자 선택 도구가 사라져서 계속 진행할 방법을 모르겠습니다. 내가 연락처를 선택하면 은 또한, 바로 내가 콘솔이 얻을 :

"Unbalanced calls to begin/end appearance transitions for 
<ABMembersViewController: 0xa1618c0>." 

어떤 도움을 주시면 감사하겠습니다.

+0

, 이메일 주소가없는 연락처를 비활성화 (예 : 회색으로 표시) 할 수 있습니다. 전자 메일 주소가있는 사람들 만 표시하려면 전자 메일 주소 (및 [여기에 표시] (http://stackoverflow.com/a/25254013/1271826))가있는 배열을 만들어 해당 목록에 표시하십시오. 자신의 테이블보기. – Rob

답변

7

문제를 해결 한 적이 있는지 모르겠지만 다른 사람이이 게시물을 찾으면 도움이 될 것입니다. 나는 ABPeoplePickerNavigationController에서 이메일을 얻기 위해 무슨 짓을 는

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person; 

에서

[self dismissModalViewControllerAnimated:YES]; 

을 제거 한 후 나는 컨트롤러

- (BOOL)peoplePickerNavigationController(ABPeoplePickerNavigationController*)peoplePicker 
    shouldContinueAfterSelectingPerson:(ABRecordRef)person 
          property:(ABPropertyID)property 
          identifier:(ABMultiValueIdentifier)identifier 
{ 
    if (kABPersonEmailProperty == property) 
    { 
     ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty); 
     NSString *email = (__bridge NSString *)ABMultiValueCopyValueAtIndex(multi, 0); 
     NSLog(@"email: %@", email); 
     [self dismissModalViewControllerAnimated:YES]; 
     return NO; 
    } 
    return YES; 
} 

에게 이메일을하고 기각이 사용하고 사용자가 특정 전자 메일을 선택하고 오류없이 컨트롤러를 닫을 수 있습니다.

+0

감사합니다. Jeff, 마지막에 게시 한 코드와 유사하지만 답변을 게시하는 것을 잊었습니다. – Aleph72

3

내가 알 수있는 한 실제로 선택한 이메일 주소는 알려주지 않습니다. 연락처에 "집"및 "직장"전자 메일이있는 경우 ABMultiValueCopyValueAtIndex(multi, 0)은 "집"전자 메일을 제공합니다.

식별자에서 선택한 이메일의 색인을 가져와야합니다.

- (BOOL)peoplePickerNavigationController: 
(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
           property:(ABPropertyID)property 
           identifier:(ABMultiValueIdentifier)identifier 
{ 
    if (property == kABPersonEmailProperty) { 
     ABMultiValueRef emails = ABRecordCopyValue(person, property); 
     CFIndex ix = ABMultiValueGetIndexForIdentifier(emails, identifier); 
     CFStringRef email = ABMultiValueCopyValueAtIndex(emails, ix); 

     [self dismissViewControllerAnimated:YES completion:nil]; 

     [self callMethodWithEmailString:(__bridge NSString *)(email)]; 
     if (email) CFRelease(email); 
     if (emails) CFRelease(emails); 
    } 

    return NO; 
} 

관련 질문 :