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

Я - близкое отчаяние, поскольку я ищу решение в течение многих недель теперь.

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

  • Через 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: при прохождении через первых шагов порядка, можно выбрать адрес поставки точно этот путь: От Списка контактов-> Выбор Человек-> Выбор Адрес-> Выбор Номер телефона. Там, все (кажется) происходит в модальном представлении только с иерархией навигации с еще одним уровнем, чем в стандартном коде, показанном выше.

11
задан Cyclonecode 22 November 2012 в 06:35
поделиться

4 ответа

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

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

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

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

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

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

1
ответ дан 3 December 2019 в 06:46
поделиться

Думаю, это то, что вам нужно:

- (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 и позволить вашему people picker'у подталкивать его, поскольку ABPeoplePickerNavigationController является подклассом NSPeoplePickerNavigationController.

15
ответ дан 3 December 2019 в 06:46
поделиться

В предложенном ответе отсутствует выпуск

CFRelease (multi);

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

1
ответ дан 3 December 2019 в 06:46
поделиться

Следующий метод должен вернуть NO:

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

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

1
ответ дан 3 December 2019 в 06:46
поделиться