Я пытаюсь отфильтровать некоторые контакты из адресной книги с набором существующих телефонных номеров. 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 Представляем платформу контактов для сеанса iOS и OS X. Они сказали, что predicateForEnablingContact
оценивается на «CNContact». В документе не сказано, что предикат должен быть от CNContact+Predicates
, как CNContactFetchRequest
.