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

Любая помощь будет оценена.

2 ответа

Решение

Я не уверен, что вы когда-нибудь решили свою проблему, но если кто-то еще найдет этот пост, возможно, он поможет им. То, что я сделал, чтобы получить письмо от 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;
}

Это позволяет пользователю выбрать конкретный адрес электронной почты и отклоняет контроллер без каких-либо ошибок.

Насколько я могу судить, это не даст вам адрес электронной почты, который был выбран. Если контакт имеет "домашнюю" и "рабочую" электронную почту, тогда 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;
}

Смежные вопросы:

Другие вопросы по тегам