2013-04-11 2 views
4
- (BOOL)peoplePickerNavigationController: 
(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person { 

     DefaultContactSelectViewController *view = [[self storyboard] instantiateViewControllerWithIdentifier:@"DefaultContactView"]; 
     view.recordID = recordID; 
     view.phones = phones; 
     view.emails = emails; 
     view.first_name = first_name; 
     view.last_name = last_name; 
     view.delegate = self; 

     [peoplePicker pushViewController:view animated:YES]; 
    return NO; 
} 

В приведенном выше примере кода, я выдвигаю контроллер просмотра пользовательских контактов после выбора контакта. Проблема заключается в том, что контакт выбран из результата поиска, а затем пользователь нажимает на кнопку, чтобы вернуться к элементу выбора контактов, результат поиска будет удален.ABPeoplePickerNavigationController shouldContinueAfterSelectingPerson возврат к результатам поиска

Эта проблема не возникает, если приведенный выше код возвращает ДА, но затем он будет вызывать вид контакта по умолчанию, который не является тем, что я хочу.

Заранее спасибо, если вы знаете, как я могу исправить эту проблему.

ответ

2

Возможно, вы должны написать пользовательский 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 пытается скрыть представление результатов поиска, появляется небольшое мерцание.

+0

Это сработало, спасибо. Я также сохранил позицию прокрутки результата поиска и добавил: [self.peoplePickerRootViewController.searchDisplayController.searchResultsTableView setContentOffset: scrollPosition animated: NO]; tonavigationController «willShowViewController», но настройка прокрутки работает только в «didShowViewController», что не идеально. Любая идея, почему она не будет устанавливать прокрутку в willShowViewController? –

0

Хорошо, у меня была аналогичная проблема. Я полагаю, вы используете ARC?

Если так я спасен и прошел весь в ABRecordRef к моему другому мнению и затем должен был сохранить объект человека с помощью:

CFRetain(m_MyContact object); 

Не забудьте, чтобы затем использовать CFRelease() на объект, когда вы закончили ,

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