Как реализовать умный поиск контактов по имени и номеру по T9 в iOS?
Я работаю над приложением контактов, и мне было интересно, можно ли искать контакты, как это делают дилеры T9 (буквы, связанные с каждым номером, также фильтруют результаты). Поэтому, если я нажму клавишу 2, она должна искать номер "2", а также "ABC".
Код, который я пытаюсь:
let enteredChar = dialerTextField.text!
var pattern = keysDictionary?[enteredChar.last]
pattern = "[\(String(describing: pattern!.first)) - \(String(describing: pattern!.last))]"
// pattern = "[m-o]" Regex
do {
let matches = items.filter({
(item : String) -> Bool in
let stringMatch = item.range(of: pattern!, options: .regularExpression, range: nil, locale: nil)
return stringMatch != nil ? true : false
})
let predicate = CNContact.predicateForContacts(matchingName: pattern!)
let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactImageDataKey, CNContactImageDataAvailableKey]
var contacts = [CNContact]()
var message: String!
let contactsStore = CNContactStore()
do {
contacts = try contactsStore.unifiedContacts(matching: predicate, keysToFetch: keys as [CNKeyDescriptor])
if contacts.count == 0 {
message = "No contacts were found matching the given name."
}
}
catch {
message = "Unable to fetch contacts."
}
print("matches : ", contacts)
}
catch {
}
используя приведенный выше код, я могу искать имя контакта, если я изменяю pattern
сказать "Роб", но это не работает с Regex "[p-s]"
, Я хотел бы искать с помощью регулярных выражений. Как это может быть сделано? Спасибо.
2 ответа
Нет библиотеки, которая бы точно соответствовала вашим потребностям.
Так
Зайдите в свой проект и создайте новый Custom Keyboard Extension
для вашего приложения.
Это было в некоторой степени соответствует вашему T9 Клавиатура Tutorial From youtube
Этот учебник YouTube может помочь вам в дальнейшем
Алгоритм использования
Создать словарь, который отображает каждую букву в цифры
подобно {"a":1,"b":1,"c":1,"d":2,.. "z":9}
И извлеките все контакты и выясните последовательность номеров, соответствующих именам контактов (используйте для этого словарь выше).
лайк {"anna":"2662","baby":"2229","denis":"33647","emila":"36452"}
Всякий раз, когда пользователь начинает печатать на клавиатуре, извлекайте все шаблоны, соответствующие приведенному выше словарю. "2"
Соответствующие матчи будут "anna" and "baby"
,
Устраните совпадения, когда получаете больше информации от пользователя.
Создать элементарную реализацию T9 довольно просто, все, что вам нужно сделать, это разобрать контакты в словаре. ключом будет число, а значением будет список контактов.
например, если у вас есть список контактов: Джон, Стэн, Папа, Фэй, вы бы проанализировали его в словаре:
5666 - ["John"]
7826 - ["Stan"]
323 - ["Dad", "Fae"]
когда пользователь вводит цифры, вы просто запрашиваете словарь и либо не показывает результатов, либо соответствует массиву контактов.