如何使用CNContactPickerViewController使用一组电话号码过滤联系人?

时间:2016-05-27 10:47:38

标签: ios cncontact

我尝试使用一组现有的电话号码过滤地址簿中的某些联系人。如果这些联系人与现有电话号码匹配,则CNContactPickerViewController应禁用这些联系人的选择。

我需要使用电话号码作为过滤器,因为这些电话号码可以来自其他应用平台。并且该服务不应允许用户使用已存在的相同电话号码的联系人。我不想为这个快速行动创建我自己的联系人选择器。

这是我到目前为止所尝试的内容。

NSArray<CNPhoneNumber *> *existingPhoneNumbers = @[@"1111", @"2222"];

CNContactPickerViewController *contactPicker = [[CNContactPickerViewController alloc] init];
contactPicker.delegate = self;
contactPicker.displayedPropertyKeys = @[CNContactNamePrefixKey,
                                        CNContactGivenNameKey,
                                        CNContactFamilyNameKey,
                                        CNContactOrganizationNameKey,
                                        CNContactPhoneNumbersKey];

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"NOT (ANY phoneNumbers.value.stringValue IN %@)", existingPhoneNumbers];

contactPicker.predicateForEnablingContact = predicates;

错误讯息:

[CNUI ERROR] Error when showing picker: Error Domain=CNErrorDomain Code=300 "(null)" UserInfo={CNValidationErrors=(
"Error Domain=CNErrorDomain Code=400 \"Invalid Predicate\" UserInfo={CNKeyPaths=(\n    \"phoneNumbers.value.stringValue\"\n), NSLocalizedDescription=Invalid Predicate, NSLocalizedFailureReason=The operation couldn't be completed because its predicate is invalid.}")}

使用SUBQUERY时,它仍无效。

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(phoneNumbers, $CNLabeledValue,$CNLabeledValue.value.stringValue IN %@).@count == 0"];

错误讯息:

[CNUI ERROR] Error when showing picker: Error Domain=CNErrorDomain Code=300 "(null)" UserInfo={CNValidationErrors=(
"Error Domain=CNErrorDomain Code=400 \"Invalid Predicate\" UserInfo={CNKeyPaths=(\n    \"value.stringValue\"\n), NSLocalizedDescription=Invalid Predicate, NSLocalizedFailureReason=The operation couldn't be completed because its predicate is invalid.}")}

还尝试使用predicateWithBlock:。它根本不支持基于块的谓词。

来自WWDC 2015 Introducing the Contacts Framework for iOS and OS X session。 他们说predicateForEnablingContact是在CNContact&#39;上进行评估的。该文档并未说谓词必须来自CNContact+Predicates CNContactFetchRequest

2 个答案:

答案 0 :(得分:1)

已经发现了这个问题。当我遇到这个问题时,我的头发几乎掉了下来。解决方案是将撇号添加到值。喜欢这个

let predicate = NSPredicate(format: "ANY self.phoneNumbers.'value'.'digits' BEGINSWITH %@", "+420" 

我希望这会对你有所帮助。

答案 1 :(得分:0)

我希望您找到了想要的解决方案。我将分享我如何处理此类问题。可能会帮助别人。

我想将CNContactPickerViewController限制为仅显示联系人,比方说我集合中仅有的联系人(电话号码)。因此,基本上,与您的情况不同,我只想显示现有用户。因此,在viewDidLoad中...

let exsitingNumbers = Set(["1111", "2222"])
let predicate = NSPredicate(format: "SUBQUERY(phoneNumbers, $x, $x.'value'.'stringValue' IN %@).@count > 0", exsitingNumbers)
self.contactPicker.predicateForEnablingContact = predicate

For more details about SUBQUERY in NSPredicate,看看吧。