2015-10-10 5 views
1

Я хочу отображать только те контакты с конкретными номерами телефонов. Номера телефонов записываются в массив. Я не знаю, как отображать только эти контакты. Поэтому я попытался использовать метод predicateForEnablingContact. Но с моим кодом все контакты отключены, даже те, у которых есть правильный номер. Я использую структуру контактов. Помощь будет высоко оценена.Отображать только контакты с правильным номером телефона (Структура контактов)

func picker() { 
    let numbers = ["555","8885555512"] 
    let pick = CNContactPickerViewController() 
    pick.displayedPropertyKeys = [CNContactPhoneNumbersKey] 
    pick.predicateForEnablingContact = NSPredicate(format: "phoneNumbers = %@", argumentArray: numbers) 
    pick.delegate = self 
    presentViewController(pick, animated: true, completion: nil) 
} 
func contactPicker(picker: CNContactPickerViewController, didSelectContacts contacts: [CNContact]) { 
    let Kontakte = contacts 
    print(Kontakte) 
    dismissViewControllerAnimated(true, completion: nil) 
} 
+0

'phoneNumbers' не является массивом чисел, поэтому он никогда не будет соответствовать вашему массиву' numbers'. Вам нужно подумать о том, что «с конкретными номерами телефонов» действительно означает для вас. – matt

+0

Я хочу сделать чат-приложение и отображать только те контакты, которые используют приложение. Я думал, что смогу это сделать, загрузив номер пользователя из синтаксического анализа и используя этот номер для поиска контактов. Но он должен работать, если я ищу контакты phonenumbers для разбора, а затем загрузите имя, если оно существует, а затем используйте Predicate с именем или это тоже неправильно? –

+0

"для отображения только контактов, в которых используется приложение« Идентификатором контакта является его «идентификатор». – matt

ответ

1

Этот код возвращает только те контакты, которые имеют номер телефона в данном наборе:

let numbers = Set(["555","8885555512"]) 

let predicate = NSPredicate { (evaluatedObject, bindings) -> Bool in 
    guard let evaluatedContact = evaluatedObject as? CNContact else { return false } 
    return Set(evaluatedContact.phoneNumbers.map{ return ($0.value as! CNPhoneNumber).stringValue }).intersect(numbers).count > 0 
} 

Обратите внимание, что numbers является набор. Это необходимо для использования метода intersect. intersect используется для определения того, имеет ли контакт общие номера телефонов с указанными номерами; если это так, то предикат приводит к true.

+0

Я не думаю, что «нормальные» предикаты работают с картой «Контакты». Увы ... –

+0

@FredA. Для большинства фреймворков контактов это верно, но если вы проверяете документы CNContactPickerViewController, это не означает, что вы не можете. – erdekhayser

+2

Вы пробовали это? Потому что у меня есть, и он не работает ... Кроме того, в документе говорится: «Обратите внимание, что общие и составные предикаты не поддерживаются рамкой« Контакты » –

1

Я использовал KPKContacts пакет

Сва, как простой, как вызов этого метода

var contacts: [KPKContact]() 
let contactStore = KPKContactStore() 
//make sure you implement the delegate method that will notify contact authorisation changes 
contactStore.delegate = self 

self.kpkContactStore.findContactsWithValidNumbersOnly(){ 
    kpkContacts in 
    if let contacts = kpkContacts { 
     self.contacts = contacts 
     self.tableView.reloadData() 
    } 
} 

Он поставляется с регулярным выражением по умолчанию для телефонных номеров, отформатированных в ### ### ###, ## # - ### - ###, (###) ### - ####, # - ### - ### - ###, ### - ### - ###, #########

Вы можете альтернативно получить свое собственное регулярное выражение из регулярных выражений ресурсов и изменить свойство PHONE_REGEX в этом методе

private var regexPhoneNumberValidatorBlock: String -> Bool = { value in 
let PHONE_REGEX = "^\\s*(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})[-.)]*(\\d{3})[-. ]*(\\d{4})(?: *x(\\d+))?\\s*$" 
    let phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX) 
    let result = phoneTest.evaluateWithObject(value) 
    return result 
} 
Смежные вопросы