从ios 8中的地址簿访问联系人详细信息时,注意到这种奇怪的行为。 我的场景很简单
推送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解雇了。 请赐教我。
答案 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
来处理这种特殊情况(在你的呈现视图控制器中使用一个标志)。但这也有点笨拙。