Я - близкое отчаяние, поскольку я ищу решение в течение многих недель теперь.
Проблема проста:
Решение до третьего аспекта известно:
- (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: при прохождении через первых шагов порядка, можно выбрать адрес поставки точно этот путь: От Списка контактов-> Выбор Человек-> Выбор Адрес-> Выбор Номер телефона. Там, все (кажется) происходит в модальном представлении только с иерархией навигации с еще одним уровнем, чем в стандартном коде, показанном выше.
В приложении Pastie для iPhone я использовал другой подход.
(источник: manicwave.com )
Я использую peoplePicker, чтобы выбрать человека, а затем открываю редактор контактов (людей).
Это простое представление:
Имя контактного лица Номер телефона> по умолчанию - первый номер телефона адрес электронной почты> по умолчанию - первый адрес электронной почты
Каждый из номеров телефона и электронной почты адрес вызывает другое представление, показывающее список телефонов или адресов электронной почты, с галочкой рядом с текущим выбранным.
Я использую этот вид для первоначальной настройки контакта, а также для последующего редактирования.
Думаю, это то, что вам нужно:
- (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.
В предложенном ответе отсутствует выпуск
CFRelease (multi);
Без этого выпуска произойдет утечка. Или, по крайней мере, согласно Построить и проанализировать в Xcode ....
Следующий метод должен вернуть NO:
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController*)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
...
return NO;
}
Это позволит вызвать ваш следующий метод (peoplePickerNavigationController: shouldContinueAfterSelectingPerson: property: identifier :).