在 iOS8 上将 ABPersonViewController 推送到 ABPeoplePickerNavigationController
Posted
技术标签:
【中文标题】在 iOS8 上将 ABPersonViewController 推送到 ABPeoplePickerNavigationController【英文标题】:Pushing ABPersonViewController to ABPeoplePickerNavigationController on iOS8 【发布时间】:2014-10-30 20:09:04 【问题描述】:展示人物选择器
ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init];
peoplePicker.allowsActions = YES;
peoplePicker.allowsEditing = NO;
peoplePicker.peoplePickerDelegate = self;
[self presentViewController:peoplePicker animated:YES completion:nil];
在 ios 7 中实现 ABPeoplePickerNavigationControllerDelegate
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
ABPersonViewController *personViewController = [[ABPersonViewController alloc] init];
personViewController.displayedPerson = person;
[peoplePicker pushViewController:personViewController animated:YES];
return NO;
到目前为止一切顺利。人员视图控制器按预期呈现。 iOS7 方法返回一个值 - 可以返回 NO 以确保人员选择器保持打开状态。在 iOS8 中,上述委托方法已被弃用,必须实现新方法:
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
ABPersonViewController *personViewController = [[ABPersonViewController alloc] init];
personViewController.displayedPerson = person;
[peoplePicker pushViewController:personViewController animated:YES];
人员视图控制器被推送到人员选择器,但在几分之一秒后人员选择器被关闭(与人员视图控制器一起)。
有没有办法防止人们选择器在 iOS8 上被解雇?还有其他建议吗?
【问题讨论】:
你所做的总是错的。像这样将 ABPersonViewController 推送到 ABPeoplePickerNavigationController 上从来都不是正确的。重新考虑您的界面。 从根本上说,您想要达到什么目的?为什么不让人员选择器向您展示人员本身? @Rob 我希望 ABPersonViewController 显示默认不显示的操作按钮。 如果要显示自定义详细视图而不是默认视图怎么办?如果苹果使用公共的dismissModal 方法而不是私有的API 来关闭控制器,那也不会那么糟糕。马虎... @matt 为什么在 iOS 7 上出错了?能详细点吗? 【参考方案1】:使用presentViewController
代替pushViewController
怎么样...在Xcode 6 中它说pushViewController 已被弃用,我看到您正在尝试在iOS8 中实现它,所以试一试...
像这样一行:
[peoplePicker presentViewController: personViewController animated: YES completion: nil];
【讨论】:
我有确切的例子,但它很快......所以我认为这应该可行。 它可以工作,但这不是我想要的。谢谢。 可能我无法理解您的问题。您只想显示操作按钮? 显示操作按钮,同时将人员视图控制器推入人员选择器。您建议显示替换人员选择器而不是被推送到它的人员视图控制器。【参考方案2】:-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person
[self dismissViewControllerAnimated:NO completion:^
ABPersonViewController *personController = [[ABPersonViewController alloc] init];
[personController setDisplayedPerson:person];
[personController setPersonViewDelegate:self];
[personController setAllowsEditing:NO];
personController.displayedProperties = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonPhoneProperty], nil];
[self.navigationController pushViewController:personController animated:YES];
];
【讨论】:
【参考方案3】:在 iOS8 中,初始化 ABPeoplePickerNavigationController 时需要添加如下代码,否则 peoplePickerNavigationController 在选择联系人后会立即关闭。
if(IOS8_OR_LATER)
peoplePicker.predicateForSelectionOfPerson = [NSPredicate predicateWithValue:false];
【讨论】:
以上是关于在 iOS8 上将 ABPersonViewController 推送到 ABPeoplePickerNavigationController的主要内容,如果未能解决你的问题,请参考以下文章
为啥触摸 SCNView 顶部的滑块会在 iOS 8/Swift 上将相机移动到下方?
iOS:在 iOS 7 和 iOS 8 上将约束应用于子视图的自动布局差异
在 XCode 6 上将尺寸等级(即 Compact WITH/Compact H)重置为 Any W/An W
对不同的 iOS 版本使用不同的 Info.plist 文件?
ABPersonViewController 在推送到 PeoplePickerNavigationController 时未检索数据