iOS中的T9如何实现联系人姓名号码智能搜索?
How to implement smart searching of contacts by name and number by T9 in 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
更改为 "Rob",我可以搜索联系人姓名,但它不适用于正则表达式 "[p-s]"
。我想用正则表达式搜索。如何才能做到这一点?谢谢。
没有完全符合您需要的可用库。
所以
转到您的项目并为您的应用程序创建一个新的 Custom Keyboard Extension
。
这与您的 T9 键盘有点匹配 Tutorial 来自 youtube
这个 youtube 教程 here 可能会进一步帮助您
要使用的算法
创建一个将每个字母映射到数字的字典
喜欢{"a":1,"b":1,"c":1,"d":2,.. "z":9}
并获取所有联系人并找出与联系人姓名对应的数字模式(为此使用上面的字典)。
喜欢{"anna":"2662","baby":"2229","denis":"33647","emila":"36452"}
每当用户开始在键盘上打字时,获取上述字典中匹配的所有模式
就像如果用户输入 "2"
对应的匹配项将是 "anna" and "baby"
.
从用户那里获得更多输入时消除匹配项。
创建基本的 T9 实现非常简单,您需要做的就是将联系人解析为字典。键将是一个数字,值将是一个联系人列表。
例如,如果您有一个联系人列表:John、Stan、Dad、Fae,您会将其解析为字典:
5666 - ["John"]
7826 - ["Stan"]
323 - ["Dad", "Fae"]
当用户输入数字时,您只需查询字典,要么不显示任何结果,要么不显示匹配的联系人数组。
我正在开发一个联系人应用程序,我想知道是否可以像 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
更改为 "Rob",我可以搜索联系人姓名,但它不适用于正则表达式 "[p-s]"
。我想用正则表达式搜索。如何才能做到这一点?谢谢。
没有完全符合您需要的可用库。
所以
转到您的项目并为您的应用程序创建一个新的 Custom Keyboard Extension
。
这与您的 T9 键盘有点匹配 Tutorial 来自 youtube
这个 youtube 教程 here 可能会进一步帮助您
要使用的算法
创建一个将每个字母映射到数字的字典
喜欢{"a":1,"b":1,"c":1,"d":2,.. "z":9}
并获取所有联系人并找出与联系人姓名对应的数字模式(为此使用上面的字典)。
喜欢{"anna":"2662","baby":"2229","denis":"33647","emila":"36452"}
每当用户开始在键盘上打字时,获取上述字典中匹配的所有模式
就像如果用户输入 "2"
对应的匹配项将是 "anna" and "baby"
.
从用户那里获得更多输入时消除匹配项。
创建基本的 T9 实现非常简单,您需要做的就是将联系人解析为字典。键将是一个数字,值将是一个联系人列表。
例如,如果您有一个联系人列表:John、Stan、Dad、Fae,您会将其解析为字典:
5666 - ["John"]
7826 - ["Stan"]
323 - ["Dad", "Fae"]
当用户输入数字时,您只需查询字典,要么不显示任何结果,要么不显示匹配的联系人数组。