在 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的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 8 上将视频分享到 Facebook

为啥触摸 SCNView 顶部的滑块会在 iOS 8/Swift 上将相机移动到下方?

iOS:在 iOS 7 和 iOS 8 上将约束应用于子视图的自动布局差异

在 XCode 6 上将尺寸等级(即 Compact WITH/Compact H)重置为 Any W/An W

对不同的 iOS 版本使用不同的 Info.plist 文件?

ABPersonViewController 在推送到 PeoplePickerNavigationController 时未检索数据