我尝试使用一组现有电话号码从地址簿中过滤一些联系人。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.}")}
With 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:
。它根本不支持基于块的谓词。
From WWDC 2015 介绍适用于 iOS 和 OS X 的联系人框架会议 https://developer.apple.com/videos/play/wwdc2015/223/。
他们说predicateForEnablingContact
在“CNContact”上进行评估。该文档没有说谓词必须来自CNContact+Predicates
like CNContactFetchRequest
does.