Возможно, вы должны написать пользовательский PeoplePickerViewController, так как у вас никогда не будет достаточного контроля над контроллером Apple по умолчанию.
Во всяком случае, как и для решения текущей проблемы, вот что вам нужно сделать:
Объявляются три новых свойства (используйте соответствующие заявления, основанные на, если вы используете ARC или нет - я предполагаю, что нет ARC)
@property (nonatomic, assign) ABPeoplePickerNavigationController *peoplePicker;
@property (nonatomic, assign) UIViewController *peoplePickerRootViewController;
@property (nonatomic, copy) NSString *currentSearchString;
Теперь, когда вы показываете людям сборщика, добавьте следующие строки:
// save people picker when displaying
self.peoplePicker = [[[ABPeoplePickerNavigationController alloc] init] autorelease];
// save it's top view controller
self.peoplePickerRootViewController = self.peoplePicker.topViewController;
// need to see when view controller is shown/hidden - viewWillAppear:/viewWillDisappear: won't work so don't bother with it.
self.peoplePicker.delegate = self;
Теперь мы спасем строку поиска непосредственно перед нажатием зрения человека:
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
self.currentSearchString = nil;
if ([self.peoplePickerRootViewController.searchDisplayController isActive])
{
self.currentSearchString = self.peoplePickerRootViewController.searchDisplayController.searchBar.text;
}
// other stuff...
Очевидно, что в этом классе реализуется UINavigationControllerDelegate. Когда представление корня возвращается в поле зрения, мы будем принудительно отображать результаты поиска. Вот реализация для navigationController:willShowViewController:animated:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (navigationController == self.peoplePicker)
{
if (viewController == self.peoplePickerRootViewController)
{
if (self.currentSearchString)
{
[self.peoplePickerRootViewController.searchDisplayController setActive: YES];
self.peoplePickerRootViewController.searchDisplayController.searchBar.text = self.currentSearchString;
[self.peoplePickerRootViewController.searchDisplayController.searchBar becomeFirstResponder];
}
self.currentSearchString = nil;
}
}
}
Не забудьте освободить currentSearchString в dealloc, если не используется ARC.
Небольшое предостережение: при выборе человека, когда ABPeoplePickerNavigationController пытается скрыть представление результатов поиска, появляется небольшое мерцание.
Это сработало, спасибо. Я также сохранил позицию прокрутки результата поиска и добавил: [self.peoplePickerRootViewController.searchDisplayController.searchResultsTableView setContentOffset: scrollPosition animated: NO]; tonavigationController «willShowViewController», но настройка прокрутки работает только в «didShowViewController», что не идеально. Любая идея, почему она не будет устанавливать прокрутку в willShowViewController? –