2016-05-27 3 views
1

Я пытаюсь отфильтровать некоторые контакты из адресной книги с набором существующих телефонных номеров. CNContactPickerViewController должен отключить выбор этих контактов, если у них есть соответствующий номер телефона из существующих телефонных номеров.Как фильтровать контакты с помощью набора телефонных номеров с помощью 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 %@)[email protected] == 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». В документе не говорится, что предикат должен быть от CNContact+Predicates, как CNContactFetchRequest.

ответ

2

Уже найдена проблема. Мои волосы почти выпадали, когда я воспользовался этой проблемой. Решение состоит в том, чтобы добавить апостроф к значению. Нравится

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

Надеюсь, это вам поможет.

Смежные вопросы