iPhone ABPeoplePickerNavigationController - Как выбрать две отдельные записи двух разных многозначных свойств человека из адресной книги

Я почти в отчаянии, так как ищу решение уже несколько недель.

Проблема проста:

  • Через ABPeoplePickerNavigationController (как ModalView) нужно выбрать человека.
  • Затем должны отображаться только (например) почтовые адреса, и пользователь должен выбрать один из них.
  • После выбора почтового адреса должны отображаться только (например) номера телефонов, и пользователь должен выбрать один из них.

Решение до третьего аспекта хорошо известно:

- (IBAction)importFromAddressBook 
{
    ABPeoplePickerNavigationController* picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    [self presentModalViewController:picker animated:YES];
    [picker release];
}

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker 
{
    [self dismissModalViewControllerAnimated:YES];
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker 
      shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{
    [peoplePicker setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonEmailProperty]]];
    return YES;
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
                                property:(ABPropertyID)property
                              identifier:(ABMultiValueIdentifier)identifier 
{
    //===PROBLEM=== Now I do have a mail address and I want to have a phone number right afterwards.

    //Something like this would be straightforward, but the view does not change this way:
    [peoplePicker setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]];
    //Here misses the important code.


    //And only when I also got a phone number through this or a similar method I want to call:
    [peoplePicker dismissModalViewControllerAnimated:YES];

    //I do not want to start default behaviour with the mailaddress and/or phone number:
    return NO;
}

Правильный подход, кажется, подталкивает аналогичный вид PeoplePicker к NavigationController ModalView, но я не знаю, как это сделать.

Если бы у кого-то была идея, было бы здорово!

Если вы хотите увидеть такое поведение в действии, вы можете взглянуть на приложение Amazon: если вы пройдете первые шаги заказа, вы можете выбрать адрес доставки именно таким образом: из списка контактов -> выберите человека -> Выберите адрес -> выберите номер телефона. Там все (кажется) происходит в модальном представлении только с навигационной иерархией на один уровень больше, чем в показанном выше стандартном коде.


person André    schedule 24.02.2010    source источник


Ответы (4)


Я думаю, это может быть то, что вы хотите:

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

    ABPersonViewController *controller = [[ABPersonViewController alloc] init];
    controller.displayedPerson = person;
    controller.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]];
    controller.personViewDelegate = self;
    [peoplePicker pushViewController:controller animated:YES];
    [controller release];
    return NO;
}

- (BOOL)personViewController:(ABPersonViewController *)personViewController 
shouldPerformDefaultActionForPerson:(ABRecordRef)person 
                    property:(ABPropertyID)property
                  identifier:(ABMultiValueIdentifier)identifierForValue
{
    ABMutableMultiValueRef multi = ABRecordCopyValue(person, property);
    CFStringRef phone = ABMultiValueCopyValueAtIndex(multi, identifierForValue);
    NSLog(@"phone %@", (NSString *)phone);
    CFRelease(phone);

    ABPeoplePickerNavigationController *peoplePicker = (ABPeoplePickerNavigationController *)personViewController.navigationController;
    [peoplePicker dismissModalViewControllerAnimated:YES];
    return NO;
}

Идея состоит в том, чтобы создать еще один экземпляр ABPersonViewController и позволить вашему средству выбора людей нажимать его, поскольку ABPeoplePickerNavigationController является подклассом NSPeoplePickerNavigationController.

person zonble    schedule 16.03.2010
comment
Я тоже хочу извиниться перед тобой. Я не собирался не реагировать. Это было именно то, что я искал! - person André; 07.04.2010
comment
В коде есть ошибка - вы НЕ должны использовать идентификатор в качестве индекса в строке ABMultiValueCopyValueAtIndex(multi,identifierForValue). Преобразование идентификатора в индекс свойства с помощью ABMultiValueGetIndexForIdentifier - person software evolved; 20.11.2012

В предложенном ответе отсутствует релиз

CFRRelease (мульти);

Без этого выпуска произойдет утечка. Или, по крайней мере, в соответствии со сборкой и анализом в Xcode....

person Arnold    schedule 22.05.2010

Следующий метод должен возвращать НЕТ:

- (BOOL)peoplePickerNavigationController: 
  (ABPeoplePickerNavigationController*)peoplePicker 
  shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{
  ...
  return NO;
}

Это позволит вызвать ваш следующий метод (peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:).

person David.Chu.ca    schedule 20.07.2010

В своем приложении для iPhone Pastie я применил другой подход. alt text
(источник: manicwave.com)

Я использую PeoplePicker, чтобы выбрать человека, а затем открыть редактор контакта (человека).

Это простое представление:

Имя контакта Номер телефона > по умолчанию первый номер телефона Адрес электронной почты > по умолчанию первый адрес электронной почты

Каждый номер телефона и адрес электронной почты открывает другое представление, показывающее список телефонов или адресов электронной почты с галочкой рядом с выбранным в данный момент.

Я использую этот вид для первоначальной настройки контакта, а также для последующего редактирования.

person Jeff Schilling    schedule 28.02.2010
comment
Мне так жаль, что я еще не ответил! Ваш комментарий привел меня к решению, которое было почти таким же, как у zonble. Большое Вам спасибо!! - person André; 07.04.2010