-7

我正在开发一个联系人应用程序,我想知道是否可以像 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 {

        }

使用上面的代码,如果我改为说“Rob”,我可以搜索联系人姓名,pattern但它不适用于 Regex "[p-s]"。我想用正则表达式搜索。如何才能做到这一点?谢谢你。

4

2 回答 2

5

没有可用的库完全符合您的需要。

所以

转到您的项目并Custom Keyboard Extension为您的应用程序创建一个新项目。

在此处输入图像描述

这有点符合你的 T9 键盘教程来自 youtube

此处的此 youtube 教程可能会进一步帮助您

使用的算法

创建一个字典,将每个字母映射到数字

喜欢{"a":1,"b":1,"c":1,"d":2,.. "z":9}

并获取所有联系人并找出与联系人姓名对应的数字模式(使用上面的字典)。

喜欢{"anna":"2662","baby":"2229","denis":"33647","emila":"36452"}

每当用户开始在键盘上键入时,获取上述字典中匹配的所有模式就像用户键入"2"相应的匹配项一样"anna" and "baby"

从用户获得更多输入时消除匹配项。

于 2017-07-20T06:44:32.087 回答
0

创建一个基本的 T9 实现非常简单,您只需将联系人解析为字典即可。键是数字,值是联系人列表。

例如,如果您有一个联系人列表:John、Stan、Dad、Fae,您会将其解析为字典:

5666 - ["John"]
7826 - ["Stan"]
323 - ["Dad", "Fae"]

当用户输入数字时,您只需查询字典,要么不显示任何结果,要么显示匹配的联系人数组。

于 2017-07-22T03:51:58.440 回答