ios 8:ABPeoplePickerNavigationController关闭实现人员选择器委托方法

时间:2014-11-15 10:40:41

标签: objective-c abpeoplepickerview ios8.1

从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];
    }
    
  5. 但是ABPeoplePickerNavigationController解雇了。 请赐教我。

3 个答案:

答案 0 :(得分:0)

我不知道在“ 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];

这对我有用,希望你们也克服它:)

答案 1 :(得分:0)

例如,如果您选择具有单个电子邮件地址的联系人,它会自动解除。 如果联系人有多个电子邮件,则必须指定一个谓词,该谓词将强制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"];
    }

答案 2 :(得分:0)

我相信iOS 8中的默认行为是在调用didSelectPerson时自动关闭ABPeoplePickerNavigationController

未显示SecondViewController的原因(我推断这是问题症状)是因为您试图在SecondViewController时推送ABPeoplePickerNavigationController被解雇。这种重叠动画是iOS核心视图管理/动画系统试图避免的问题。

发生这种情况时,您可能会在控制台中收到警告。

@ Ratul的解决方案有效,因为它可以绕过这种默认行为。

在我的场景中,我的代码在UIAlertController内呈现didSelectPerson之前会休息一秒钟。这是一个黑客,取决于ABPeoplePickerNavigationController解雇动画不到一秒钟。对我来说,如果没有显示此警报,则没有人会注意到这是一个问题。

如果你想要更健壮的东西,你可能想要覆盖viewDidAppear来处理这种特殊情况(在你的呈现视图控制器中使用一个标志)。但这也有点笨拙。