如何在 iOS 中选择联系人电话号码?

Posted

技术标签:

【中文标题】如何在 iOS 中选择联系人电话号码?【英文标题】:How can I pick a contact phone number in iOS? 【发布时间】:2017-05-28 03:20:01 【问题描述】:

我知道如何在 ios 中选择联系人(使用 CNContactPickerViewController),但我如何才能选择联系人的特定电话号码,而不是联系人本身?根据文档,这应该是可能的,但我没有找到方法。

编辑:这是我的代码

CNContactPickerViewController *contactPicker = [[CNContactPickerViewController alloc] init];

contactPicker.delegate = self;
contactPicker.displayedPropertyKeys = @[CNContactGivenNameKey, CNContactImageDataAvailableKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey, CNContactThumbnailImageDataKey, CNContactIdentifierKey];

[self presentViewController:contactPicker animated:YES completion:nil];

所以,我确实设置了显示属性,但结果是一样的,即使我只选择 CNContactPhoneNumbersKey,我也不会看到所有联系人的号码,因此我可以选择一个特定的号码。

我错过了什么?

编辑 2:回调方法,根据要求。我不知道它们有什么意义,但尽管如此。

-(void) contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact
  //NSLog(@"Contact : %@",contact);
  NSString* contactName = [NSString stringWithFormat:@"%@%@%@", contact.givenName, @" ", contact.familyName];
  [currentButton setTitle:contactName forState:UIControlStateNormal];
  [currentName setText:contactName];
...


-(void) contactPickerDidCancel:(CNContactPickerViewController *)picker 
  //NSLog(@"Cancelled");

【问题讨论】:

每个联系人都有一个电话号码数组,通过数组搜索选择一个特定的电话号码 好吧,我也可以搜索一组联系人并选择一个特定的联系人,但拥有选择器会更有帮助。在 android 中,您可以选择一个数字,根据文档,iOS 也是如此,我在文档中读到:“CNContactPicker 对象显示用于选择联系人的基于弹出框的系统界面。此类的方法和属性帮助您选择联系人或联系人的值,例如联系人的电话号码或电子邮件地址。” 【参考方案1】:

好的,答案如下:

首先,在displayedPropertyKeys中只使用你想要选择的属性(在本例中为CNContactPhoneNumbersKey),并确保实现所有委托方法(即didSelectContact - 当联系人只有一个电话号码,didSelectContactProperty - 当联系人有多个电话号码时)。

此外,通过设置限制联系人选择:

contactPicker.predicateForEnablingContact = [NSPredicate predicateWithFormat:@"phoneNumbers.@count > 0"];
contactPicker.predicateForSelectionOfContact = [NSPredicate predicateWithFormat:@"phoneNumbers.@count == 1"];
contactPicker.predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"key == 'phoneNumbers'"];

【讨论】:

谢谢艾尔。在我的情况下它仍然不起作用。我这里有一个非常简单的代码:contactPicker = [[CNContactPickerViewController alloc] init]; [contactPicker setDisplayedPropertyKeys:@[CNContactPhoneNumbersKey]];然后我像你说的那样做谓词。但是我收到最后一个 predicateForSelectionOfProperty 的错误,上面写着“Error Domain=CNErrorDomain Code=400 \"Invalid Predicate\" UserInfo=CNKeyPaths=(\n phoneNumber\n), NSLocalizedDescription=Invalid Predicate" 我试过让它成为 phoneNumbers ,它仍然给我同样的错误'无效谓词' 我也尝试了这个带有撇号的谓词,即 [NSPredicate predicateWithFormat:@"key == 'phoneNumber'"],这样无效谓词错误就消失了,但我的选择仍然不是基于属性, 它基于联系人。感觉好像我一定错过了其他部分,我已经验证我已经正确设置了委托,并且还在实现 didSelectContacts 和 didSelectContactProperties(我想要多项选择)。 我发布的是工作代码。也许你在某个地方有错字?或者您的目标是旧的 iOS 版本? @Pankaj - 我确认此代码有效。 (谢谢!)我正在使用它来选择电子邮件地址,但我想我已经发现了为什么你的电子邮件地址不起作用。试试contactPicker.predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"key == 'phoneNumbers'"];。键名是here。 对我不起作用,只有选择联系人被调用(不是选择属性之一),而且我无法让它显示电话号码。奇怪,我知道它应该工作!我正在使用 Swift 4 仅供参考【参考方案2】:

您需要设置CNContactPickerdisplayedKeys 属性。如果不设置任何键,则只能选择一个联系人。如果您设置了键,那么您选择一个联系人,然后您选择所需的联系人属性。

实施适当的委托方法以完成该过程。

【讨论】:

感谢您的回复!我正在设置显示的PropertyKeys,但没有成功。我发布了我的代码,也许你能发现问题? 您是否实现了正确的委托方法?使用您已实现的委托方法更新您的问题。顺便说一句-您的问题表明您正在使用CNContactPicker,但您的代码显示您使用的是CNContactPickerViewController 我发布了委托方法的实现。使用 CNContactPicker 和 CNContactPickerViewController 解决这个问题有什么区别?两者都声称可以选择联系人属性,并且都采用相同的参数。 我完成了您的答案,以便将其标记为已接受的答案。虽然有点欠缺,但方向是对的。 我正在尝试做同样的事情,接受的答案和 cmets 不清楚解决方案是什么。能详细点吗?

以上是关于如何在 iOS 中选择联系人电话号码?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 iOS 8 上选择联系人

如何仅在使用联系人选择器存在电话号码时显示

如何通过Phonegap查找具有iOS格式的联系人电话号码?

如何从 android 的电话簿中选择联系人号码到我的应用程序中?

使用联系人选择器时从具有多个号码的用户中选择一个号码

CNContactPickerViewController 在 iOS Swift 中验证手机号码