IOS 8: ABPeoplePickerNavigationController отклонить при реализации методов делегата средства выбора людей

Это странное поведение, замеченное при доступе к контактным данным из адресной книги в ios 8. Мой сценарий прост

  1. Показать таблицу контактов
  2. выберите строку, которая будет вызывать метод didSelectPerson
  3. в методе didSelectPerson
  4. нажмите 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"];
    }
Другие вопросы по тегам