2

私がやろうとしているのは、ユーザー ピッカーをユーザーに表示し、必要なすべての連絡先を選択させ、最終的にそれらすべての連絡先の電子メール アドレスを配列で取得することです。最良の方法は、ユーザーに電子メールを送信した連絡先のみを表示することです。

今まで私ができた唯一のことは、ピープルピッカーに次のコードを提示することです:

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>."

どんな助けでも大歓迎です。

4

2 に答える 2

7

問題を解決したかどうかはわかりませんが、他の誰かがこの投稿を見つけた場合、おそらく役立つでしょう。ABPeoplePickerNavigationController から電子メールを取得するために私がしたことは、削除することでした

[self dismissModalViewControllerAnimated:YES];

から

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

そして、これを使用して電子メールを取得し、コントローラーを閉じます

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

これにより、ユーザーは特定の電子メールを選択し、エラーなしでコントローラーを閉じることができます。

于 2012-10-31T20:57:22.743 に答える
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;
}

関連する質問:

于 2014-03-11T16:19:59.400 に答える