Как реализовать поиск T9 в iOS

8 минут читать

Пару лет назад я работал над приложением под названием «BOG mBank — Mobile Banking» вместе со своей командой iOS/Android. В приложении есть базовая функция, с помощью которой вы можете использовать функцию мобильного банкинга для пополнения баланса вашего собственного сотового телефона с постоплатой или баланса мобильного телефона любого контакта.

При разработке этого модуля мы заметили, что он В Android-версии приложения найти конкретный контакт было намного проще, чем в iOS-версии. Почему? Основная причина этого — поиск T9, которого нет на устройствах Apple.

Давайте объясним, что такое T9, и почему он, вероятно, не стал частью iOS, и как разработчики iOS при необходимости, можно реализовать его.

Содержание
  1. Что такое T9?
  2. Пример предиктивного ввода T9 в действии
  3. Программное использование T9 в iOS
  4. Простая архитектура
  5. Собираем все вместе
  6. Заключение
  7. Основные сведения
  8. Что такое интеллектуальный текст?
  9. Почему T9 так называется?
  10. Как использовать T9 на клавиатуре?
  11. Как включить интеллектуальный ввод текста на вашем iPhone, чтобы он мог заканчивать ваши слова или предложения во время набора
  12. Ознакомьтесь с продуктами, упомянутыми в этой статье:
  13. iPhone 11 (от 699,99 долл. США по лучшей цене)
  14. Как включить интеллектуальный ввод текста на iPhone
  15. Связанное освещение от How Чтобы сделать все: Технология:
  16. Как отключить функцию интеллектуального ввода текста на вашем iPhone двумя простыми способами
  17. Как запретить роботизированным звонкам и другим спам-звонкам достигать вашего iPhone
  18. Как выключить функцию «Найти iPhone» функция на вашем iPhone
  19. Как заблокировать номер телефона на вашем iPhone
  20. Как для записи экрана на вашем iPhone
  21. СМОТРИ ТАКЖЕ: лучший iPhone для любого типа людей и любого бюджета
  22. ТЕПЕРЬ СМОТРЕТЬ:

Что такое T9?

T9 — это технология интеллектуального ввода текста для мобильных телефонов, особенно тех, которые содержат физическую цифровую клавиатуру 3×4.

T9 был первоначально разработан Tegic Communications, и его название расшифровывается как Текст на 9 клавишах .

Вы можете догадаться, почему T9, вероятно, так и не добрался до iOS. Во время революции смартфонов ввод T9 стал устаревшим, поскольку современные смартфоны-телефоны полагались на полноценные клавиатуры, благодаря их сенсорным дисплеям. Поскольку у Apple никогда не было телефонов с физической клавиатурой и она не занималась телефонным бизнесом во время расцвета T9, понятно, что эта технология не использовалась в iOS.

T9 до сих пор используется на некоторых недорогих телефонах без сенсорный экран (так называемые обычные телефоны). Однако, несмотря на то, что в большинстве телефонов Android никогда не было физической клавиатуры, современные устройства Android поддерживают ввод T9, который можно использовать для набора контактов путем написания имени контакта, которому вы пытаетесь позвонить.

Пример предиктивного ввода T9 в действии

На телефоне с цифровой клавиатурой каждый раз, когда нажимается клавиша (1–9) (в текстовом поле), алгоритм возвращает угадайте, какие буквы наиболее вероятны для клавиш, нажатых до этой точки.

Например, чтобы ввести слово «the», пользователь должен нажать 8, а затем 4, затем 3, и на дисплее будет отображаться «t», затем «th», а затем «the». Если имеется в виду менее распространенное слово «фор» (3673), алгоритм прогнозирования может выбрать «Форд». Нажатие клавиши «следующий» (обычно клавиша «*») может вызвать «дозу» и, наконец, «вперед». Если выбрано «fore», то в следующий раз, когда пользователь нажмет последовательность 3673, fore, скорее всего, будет первым отображаемым словом. Однако, если имеется в виду слово «Феликс», при вводе 33549 на дисплее отображается «E», затем «De», «Del», «Deli» и «Felix».

Это является примером изменения буквы при вводе слов.

Программное использование T9 в iOS

Итак, давайте погрузимся в эту функцию и напишем простой пример ввода T9 для iOS. Прежде всего, нам нужно создать новый проект.

Предварительные условия, необходимые для нашего проекта, являются базовыми: Инструменты сборки Xcode и Xcode, установленные на вашем Mac.

Чтобы создать новый project, откройте приложение Xcode на Mac и выберите «Создать новый проект Xcode», затем назовите свой проект и выберите тип создаваемого приложения. Просто выберите «Приложение для одного просмотра» и нажмите «Далее».

Как вы видите, на следующем экране будет некоторая информация, которую вам необходимо предоставить.

  • Название продукта: Я назвал его T9Search
  • Team . Здесь, если вы хотите запустить это приложение на реальном устройстве, вам потребуется учетная запись разработчика. В моем случае я буду использовать для этого свою учетную запись.

Примечание. Если у вас нет учетной записи разработчика , вы также можете запустить это в Simulator.

  • Название организации: Я назвал его Toptal
  • Идентификатор организации: я назвал его «com.toptal»
  • Язык: Выберите Swift
  • Снимите флажки «Использовать основные данные», «Включить модульные тесты» и «Включить тесты пользовательского интерфейса»

Нажмите кнопку «Далее», и мы готовы начать.

Простая архитектура

Как вы уже знаете, когда вы создаете новое приложение, у вас уже есть класс MainViewController и Main.Storyboard . В целях тестирования, конечно, мы можем использовать этот контроллер.

Прежде чем мы начнем что-то проектировать, давайте сначала создадим все необходимые классы и файлы, чтобы убедиться, что у нас все настроено и работает, чтобы перейти к часть работы с пользовательским интерфейсом.

Где-нибудь внутри вашего проекта просто создайте новый файл с именем « PhoneContactsStore.swift ». В моем случае это выглядит так.

Наша первая задача — создать карту со всеми вариантами ввода с цифровой клавиатуры.

   import Contactsimport UIKitfileprivate let T9Map = ["": "0", "a": "2", "b": "2", "c": "2", "d": "3", "e":  «3», «f»: «3», «g»: «4», «h»: «4», «i»: «4», «j»: «5», «k»: «5  «,« l »:« 5 »,« m »:« 6 »,« n »:« 6 »,« o »:« 6 »,« p »:« 7 »,« q »:« 7 »,  «r»: «7», «s»: «7», «t»: «8», «u»: «8», «v»: «8», «w»: «9», «x»  «:« 9 »,« y »:« 9 »,« z »:« 9 »,« 0 »:« 0 »,« 1 »:« 1 »,« 2 »:« 2 »,« 3 »:  «3», «4»: «4», «5»: «5», «6»: «6», «7»: «7», «8»: «8», «9»: «9»  "]  

Вот и все. Мы реализовали полную карту со всеми вариантами. Теперь приступим к созданию нашего первого класса под названием « PhoneContact

Ваш файл должен выглядеть следующим образом:

Во-первых, в этом классе нам нужно убедиться, что у нас есть фильтр Regex от AZ + 0-9.

private let regex = try! NSRegularExpression (шаблон: "[^ az () 0-9 +]", параметры: .caseInsensitive)

Обычно у пользователя есть свойства по умолчанию, которые необходимо отобразить:

  var firstName: String! var lastName: String! var phoneNumber: String! var t9String: String = "" var image: UIImage?  var fullName: String!  {get {return String (format: "% @% @", self.firstName, self.lastName)}}  

Убедитесь, что вы переопределили хэш и isEqual , чтобы указать вашу пользовательскую логику для фильтрации списка.

Кроме того, нам нужен метод replace, чтобы в строке не было ничего, кроме чисел .

  override var hash: Int {get {return self.phoneNumber.hash}} override func isEqual (_ object: Any?) -> Bool {if let obj = object  в качестве?  PhoneContact {return obj.phoneNumber == self.phoneNumber} return false} private func replace (str: String) -> String {let range = NSMakeRange (0, str.count) return self.regex.stringByReplacingMatches (in: str, options  : [], range: range, withTemplate: "")}  

Теперь нам нужен еще один метод под названием calculateT9 , чтобы найти контакты, связанные с полное имя или номер телефона .

  func calculateT9 () {для c в self.replace (str:  self.fullName) {t9String.append (T9Map [String (c) .localizedLowercase] ?? String (c))} для c в self.replace (str: self.phoneNumber) {t9String.append (T9Map [String (c)  .localizedLowercase] ?? String (c))}}  

После реализации объекта PhoneContact нам нужно сохранить наши контакты где-нибудь в памяти . Для этого я собираюсь создать новый класс под названием PhoneContactStore .

У нас будет два локальных свойства:

fileprivate let contactsStore = CNContactStore ()

И:

fileprivate lazy var dataSource = Set ( )

Я использую Set , чтобы убедиться в отсутствии дублирования при заполнении этого источника данных.

   final class PhoneContactStore {fileprivate let contactsStore = CNContactStore () fileprivate lazy var dataSource = Set  () static let instance: PhoneContactStore = {let instance = PhoneContactStore () return instance} ()}   

Как видите, это класс Singleton, что означает, что мы храним его в памяти, пока приложение не запустится. Для получения дополнительной информации о синглтонах или шаблонах проектирования вы можете прочитать здесь.

Сейчас мы очень близки к завершению поиска T9.

Собираем все вместе

Прежде чем вы получите доступ к списку контактов в Apple, вам нужно сначала спросить разрешение.

  class func hasAccess () -> Bool {let authorizationStatus = CNContactStore.authorizationStatus (для: CNEntityType.contacts) return authorizationStatus == .authorized} class func requestForAccess (_ завершенияHandler: @escaping (_ accessGranted: Bool, _ error  : CustomError?) -> Void) {let authorizationStatus = CNContactStore.authorizationStatus (for: CNEntityType.contacts) переключить authorizationStatus {case .authorized: self.instance.loadAllContacts () completionHandler (true, nil) case .denied, .notDetermined: weak  var wSelf = self.instance self.instance.contactsStore.requestAccess (для: CNEntityType.contacts, завершенияHandler: {(access, accessError) -> Пусто в var err: CustomError? if let e = accessError {err = CustomError (description: e  .localizedDescription, код: 0)} else {wSelf? .loadAllContacts ()} завершенияHandler (access, err)}) по умолчанию  lt: completedHandler (false, CustomError (description: "Common Error", code: 100))}}  

После авторизации доступа к контактам мы можем написать метод для получения список из системы.

  fileprivate func loadAllContacts () {if self.dataSource.count == 0 {let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactThumbnailImageDataKey, CNContactPhoneNumbersKey] do {  let request = CNContactFetchRequest (keysToFetch: keys as [CNKeyDescriptor]) request.sortOrder = .givenName request.unifyResults = true if #available (iOS 10.0, *) {request.mutableObjects = false} else {}//Откат на более ранние версии попробуйте  self.contactsStore.enumerateContacts (with: request, usingBlock: {(contact, ok) в DispatchQueue.main.async {для телефона в contact.phoneNumbers {let local = PhoneContact () local.firstName = contact.givenName local.lastName = contact  .familyName если let data = contact.thumbnailImageData {local.image = UIImage (data: data)} var phoneNum = phone.v  alue.stringValue let strArr = phoneNum.components (separatedBy: CharacterSet.decimalDigits.inverted) phoneNum = NSArray (array: strArr) .componentsJoined (by: "") local.phoneNumber = phoneNum local.calculateT9 () self.dataSource.in  local)}}})} catch {}}}  

Мы уже загрузили список контактов в память, а это значит, что теперь мы можем написать простой метод:

  1. findWith - t9String
  2. findWith - str
  class func findWith (t9String: String) -> [PhoneContact] {return PhoneContactStore.instance.dataSource.filter ({$ 0.t9String.contains (t9String)})} class func findWith (  str: String) -> [PhoneContact] {return PhoneContactStore.instance .dataSource.filter ({$ 0.fullName.lowercased () .contains (str.lowercased ())})} class func count () -> Int {let запрос  = CNContactFetchRequest (keysToFetch: []) var count = 0;  сделай {попробуй self.instance.contactsStore. enumerateContacts (with: request, usingBlock: {(contact, ok) in count + = 1;})} catch {} return count}  

Вот и все. Готово.

Теперь мы можем использовать поиск T9 внутри UIViewController .

  fileprivate let cellIdentifier = "  contact_list_cell "последний класс ViewController: UIViewController {@IBOutlet weak var tableView: UITableView!  @IBOutlet weak var searchBar: UISearchBar!  fileprivate ленивый var dataSource = [PhoneContact] () fileprivate var searchString: String?  fileprivate var searchInT9: Bool = true override func viewDidLoad () {super.viewDidLoad () self.tableView.register (UINib (nibName: "ContactListCell", bundle: nil), forCellReuseIdentifier: "ContactListCell") self.searchBar.keyboard =.  numberPad PhoneContactStore.requestForAccess {(ok, err) in}} func filter (searchString: String, t9: Bool = true) {} func reloadListSection (section: Int, animation: UITableViewRowAnimation = .none) {}}  

Реализация метода фильтра:

  func filter (searchString: String, t9: Bool = true) {self.searchString = searchString self.searchInT9 = t9  if let str = self.searchString {if t9 {self.dataSource = PhoneContactStore.findWith (t9String: str)} else {self.dataSource = PhoneContactStore.findWith (str: str)}} else {self.dataSource = [PhoneContact] (  )} self.reloadListSection (section: 0)}  

Реализация метода Reload List:

  func reloadListSection (section: Int,  анимация: UITableViewRow  Animation = .none) {если self.tableView.numberOfSections  

И вот последняя часть нашего краткого руководства, UITableView реализация:

  расширение ViewController: UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> return UITableViewCell {  .dequeueReusableCell (withIdentifier: "ContactListCell")!  } func numberOfSections (в tableView: UITableView) -> Int {return 1} func tableView (_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {return self.dataSource.count} func tableView (_ tableView: UITableView, willDisplay cell  : UITableViewCell, forRowAt indexPath: IndexPath) {Guard let contactCell = cell as?  ContactListCell else {return} let row = self.dataSource [indexPath.row] contactCell.configureCell (fullName: row.fullName, t9String: row.t9String, number: row.phoneNumber, searchStr: searchString, img: row.image, t9Search:  self.searchInT9)} func tableView (_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {return 55} func searchBar (_ searchBar: UISearchBar, textDidChange searchText: String) {self. filter (searchString: searchText)}}  

Заключение

На этом наше руководство по поиску T9 завершается, и, надеюсь, вы нашли его простым и легким в реализации в iOS.

Но зачем вам? И почему Apple с самого начала не включила поддержку T9 в iOS? Как мы уже отмечали во введении, T9 вряд ли является убийственной функцией современных телефонов — это скорее второстепенный вопрос, возврат к временам «тупых» телефонов с механическими цифровыми клавишами.

Однако, есть еще несколько веских причин, по которым вам следует реализовать поиск T9 в определенных сценариях, либо ради единообразия, либо для улучшения доступности и взаимодействия с пользователем. На более веселой ноте, если вы ностальгируете, игра с вводом T9 может вернуть теплые воспоминания о ваших школьных днях.

Наконец, вы можете найти полный код для реализации T9 в iOS в моем репозитории на GitHub.

Основные сведения

Что такое интеллектуальный текст?

Интеллектуальный ввод текста — это технология ввода, при которой одна клавиша или кнопка представляет множество букв, например, на цифровых клавиатурах, используемых на старых мобильных телефонах. Он также используется для улучшения доступности в определенных сценариях.

Почему T9 так называется?

T9 означает «Текст на 9 клавишах», поскольку для ввода текста используется 9-значная цифровая клавиатура.

Как использовать T9 на клавиатуре?

Вот небольшой пример. Для «HELLO» вам нужно всего лишь нажать 4-3-5-5-6. Это числа, содержащие буквы, обозначающие «ПРИВЕТ».



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

Томохиро Осуми/Getty Images

  • Вы можете включить интеллектуальный ввод текста на своем iPhone в разделе« Клавиатура »в приложении« Настройки »или с самой клавиатуры.
  • Когда вы включаете интеллектуальный ввод текста на своем iPhone, он будет предлагать вводить текст над клавиатурой по мере ввода текста.
  • Посетите домашнюю страницу Business Insider для получения дополнительных историй .

С прогнозирующим текста, ваш iPhone может угадывать слова, которые вы вводите, и подсказывать, как завершать предложения.

Кроме того, он может предложить следующее слово, которое вы, возможно, захотите ввести, на основе вашего предыдущего набора текста и веб-сайтов, которые вы посетили в Safari. Используя интеллектуальный ввод текста, можно писать короткие сообщения с минимальным набором текста — или даже без набора текста.

Когда включен интеллектуальный ввод текста, вы увидите три предлагаемых слова над клавиатурой. Если по мере ввода вы видите нужное слово, просто нажмите, чтобы ввести его в свое сообщение или документ.

Интеллектуальный ввод текста включен по умолчанию, но его легко отключить, если он вас раздражает или отвлекает. И вы можете снова включить его парой нажатий.

Вот как это сделать.

Ознакомьтесь с продуктами, упомянутыми в этой статье:

iPhone 11 (от 699,99 долл. США по лучшей цене)

Как включить интеллектуальный ввод текста на iPhone

1. Запустите приложение «Настройки».

2. Нажмите «Клавиатура».

3. На странице «Клавиатуры» Включите или выключите «Прогнозный», проведя по кнопке. Он включен, когда кнопка проведена вправо, и выключена, когда кнопка находится влево.

Дэйв Джонсон/Business Insider

Вы также можете включить или выключить интеллектуальный ввод текста с самой клавиатуры.

Когда клавиатура отображается на экране, нажмите и удерживайте сочетание клавиш в нижнем левом углу (это либо эмодзи, либо значок глобуса). Затем нажмите «Настройки клавиатуры…» и включите или выключите «Прогнозирующий».

Дэйв Джонсон/Business Insider

Apple iPhone 11
599,99 долларов США от Best Buy

Связанное освещение от How Чтобы сделать все: Технология:

  • Как отключить функцию интеллектуального ввода текста на вашем iPhone двумя простыми способами

  • Как запретить роботизированным звонкам и другим спам-звонкам достигать вашего iPhone

  • Как выключить функцию «Найти iPhone» функция на вашем iPhone

  • Как заблокировать номер телефона на вашем iPhone

  • Как для записи экрана на вашем iPhone

Информационный бюллетень
Ваша утренняя шпаргалка, чтобы вы узнали все, что вам нужно знать в сфере технологий. Зарегистрируйтесь до 10 вещей, которые вам нужно знать сегодня.
Загрузка Что-то загружается.

СМОТРИ ТАКЖЕ: лучший iPhone для любого типа людей и любого бюджета

ТЕПЕРЬ СМОТРЕТЬ:

Значок закрытия Две пересекающиеся линии, образующие «X». Он указывает способ закрыть взаимодействие или отклонить уведомление.
Оцените статью
clickpad.ru
Добавить комментарий