2015-09-02 6 views
1

Я хочу реализовать поиск по всем контактам, полученным в виде таблицы с использованием ios9, рамки CNContacts. Я могу выполнить поиск через GivenName, FamilyName и т. Д., Но также хочу искать по номерам телефонов и электронной почте, когда пользователь вводит поисковый запрос в строке поиска. Так же, как мы можем искать номера телефонов/электронные письма в iOS9 Apple, контакты.Осуществить поиск по всем значениям объекта CNContact

Я знаю, поскольку phonenumbers/emailsaddresses являются массивами кортежей, это невозможно сделать, используя строку формата NSPredicate.

ответ

5

Вот что вы можете сделать

func findAllEmails() { 
    let fetch = CNContactFetchRequest(keysToFetch: [CNContactEmailAddressesKey]) 
    fetch.keysToFetch = [CNContactEmailAddressesKey] // Enter the keys for the values you want to fetch here 
    fetch.unifyResults = true 
    fetch.predicate = nil // Set this to nil will give you all Contacts 
    do { 
     _ = try contactStore.enumerateContactsWithFetchRequest(fetch, usingBlock: { 
      contact, cursor in 
      // Do something with the result...for example put it in an array of CNContacts as shown below 
      let theContact = contact as CNContact 

      self.myContacts.append(theContact) 

     }) 

    } catch { 
     print("Error") 
    } 

    self.readContacts() // Run the function to do something with the values 
} 

func readContacts() { 
    print(myContacts.count) 
    for el in myContacts { 
     for ele in el.emailAddresses { 
      // At this point you have only the email Addresses from all your contacts - now you can do your search, put it in an TableView or whatever you want to do.... 
      print(ele.value) 
     } 
    } 
} 

Я уверен, что этот код может быть оптимизирован;) Я только что сделал это быстро ... Я проверил это решение только сообщения электронной почты, но он должен работать, а также с Телефонные номера. Это зависит от вас, что вы делаете с полученными значениями. Это может быть только обходным путем, но, как вы сказали, вы не можете сделать это с помощью NSPredicate.

+1

Это сработало для меня. Re, вам не нужно устанавливать fetch.keysToFetch. Это уже задано предыдущим утверждением. Кроме того, вам не нужно вводить контакт в CNContact, это уже один. И вы можете использовать закрывающее закрытие, чтобы код выглядел чище. –

+0

Да, вы правы, спасибо за ваши предложения. К моменту, когда я уточню ответ ... –

+0

Спасибо за ответ. Я также жду ответа Apple. Посмотрим, есть ли у них оптимизированный способ. – AkhilS

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