IOS 8: ABPeoplePickerNavigationController отклонить при реализации методов делегата средства выбора людей
Это странное поведение, замеченное при доступе к контактным данным из адресной книги в ios 8. Мой сценарий прост
- Показать таблицу контактов
- выберите строку, которая будет вызывать метод didSelectPerson
- в методе didSelectPerson
нажмите SecondViewController
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person; { SecondViewController *detailVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; [detailVC.view setBackgroundColor: [UIColor redColor]]; // [peoplePicker.navigationController pushViewController:detailVC animated:YES]; [peoplePicker pushViewController:detailVC animated:YES]; }
но что происходит, ABPeoplePickerNavigationController отклонить. Пожалуйста, просветите меня об этом.
3 ответа
Я считаю, что поведение по умолчанию в iOS 8 заключается в том, что ABPeoplePickerNavigationController
автоматически закрывается при вызове didSelectPerson.
Причина в том, что SecondViewController
не отображается (я предполагаю, что это является признаком проблемы), потому что вы пытаетесь нажать SecondViewController
в то время как ABPeoplePickerNavigationController
увольняется. Эта перекрывающаяся анимация является проблемой, которую пытается избежать система управления / анимации ядра iOS.
Когда это произойдет, вы можете получить предупреждение в консоли.
Решение @Ratul работает, потому что оно обходит это поведение по умолчанию.
В моем сценарии мой код спит секунду, прежде чем представить UIAlertController
изнутри didSelectPerson
, Это взлом, который зависит от ABPeoplePickerNavigationController
анимация увольнения занимает менее секунды. Для меня, если бы это предупреждение не отображалось, никто бы даже не заметил, что это была проблема.
Если вы хотите что-то более надежное, вы можете переопределить viewDidAppear
для обработки этого особого случая (используя флаг в вашем представлении контроллера представления). Но это также становится немного неуклюжим.
Я не знаю, что такое философия, которая происходит под капотом методаdidSelectPerson, сегодня я столкнулся с той же проблемой. Я нашел простое решение, чтобы преодолеть эту проблему, я переопределил "- (void) метод завершения dismissViewControllerAnimated:(BOOL):(void (^)(void)) завершение" метода "ABPeoplePickerNavigationController". Затем осуществите это следующим образом
bool dismissedEnabled;
-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
{
if (dismissedEnabled) {
[super dismissViewControllerAnimated:flag completion:completion];
}
}
Затем внутри "didSelectPerson" я сделал следующее
viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
dismissedEnabled = false;
[self presentViewController:viewController animated:YES completion:nil];
это работает для меня, надеюсь, вы, ребята, преодолели это тоже:)
Он автоматически отклоняет, если вы выбираете контакт с одним адресом электронной почты, например. Если у контакта есть несколько электронных писем, вы должны указать предикат, который заставит ABPeoplePickerNavigationController помещать ABPersonViewController в стек.
if ([picker respondsToSelector:@selector(setPredicateForSelectionOfPerson:)])
{
// The people picker will select a person that has exactly one email address and call peoplePickerNavigationController:didSelectPerson:,
// otherwise the people picker will present an ABPersonViewController for the user to pick one of the email addresses.
picker.predicateForSelectionOfPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count = 1"];
}