如何在 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】:
您需要设置CNContactPicker
的displayedKeys
属性。如果不设置任何键,则只能选择一个联系人。如果您设置了键,那么您选择一个联系人,然后您选择所需的联系人属性。
实施适当的委托方法以完成该过程。
【讨论】:
感谢您的回复!我正在设置显示的PropertyKeys,但没有成功。我发布了我的代码,也许你能发现问题? 您是否实现了正确的委托方法?使用您已实现的委托方法更新您的问题。顺便说一句-您的问题表明您正在使用CNContactPicker
,但您的代码显示您使用的是CNContactPickerViewController
。
我发布了委托方法的实现。使用 CNContactPicker 和 CNContactPickerViewController 解决这个问题有什么区别?两者都声称可以选择联系人属性,并且都采用相同的参数。
我完成了您的答案,以便将其标记为已接受的答案。虽然有点欠缺,但方向是对的。
我正在尝试做同样的事情,接受的答案和 cmets 不清楚解决方案是什么。能详细点吗?以上是关于如何在 iOS 中选择联系人电话号码?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过Phonegap查找具有iOS格式的联系人电话号码?