.t9String.contains(t9String) }) } class func findWith(str: String) -> [PhoneContact] { return PhoneContactStore.instance .dataSource.filter({

วิธีติดตั้ง T9 Search ใน iOS



เมื่อสองสามปีก่อนฉันทำงานกับแอปชื่อ“ BOG mBank - ธนาคารบนมือถือ ” กับทีม iOS / Android ของฉัน มีคุณสมบัติพื้นฐานในแอปที่คุณสามารถใช้ฟังก์ชันการธนาคารบนมือถือเพื่อเติมยอดคงเหลือในโทรศัพท์มือถือของคุณเองหรือยอดคงเหลือในโทรศัพท์มือถือของผู้ติดต่อ

ในขณะที่พัฒนาโมดูลนี้เราสังเกตเห็นว่าการค้นหาผู้ติดต่อเฉพาะในแอปเวอร์ชัน Android นั้นง่ายกว่าใน iOS ทำไม? เหตุผลสำคัญเบื้องหลังนี้คือการค้นหา T9 ซึ่งหายไปจากอุปกรณ์ Apple



มาอธิบายกันว่า T9 คืออะไรและเหตุใดจึงไม่กลายเป็นส่วนหนึ่งของ iOS และทำอย่างไร นักพัฒนา iOS สามารถใช้งานได้หากจำเป็น



T9 คืออะไร?

T9 เป็นเทคโนโลยีข้อความคาดเดาสำหรับโทรศัพท์มือถือโดยเฉพาะที่มีแป้นตัวเลข 3x4



ภาพประกอบการค้นหา T9 บนแป้นพิมพ์ตัวเลข

T9 ได้รับการพัฒนาโดย Tegic Communications และชื่อนี้ย่อมาจาก ข้อความบนปุ่ม 9 ปุ่ม .



คุณสามารถเดาได้ว่าทำไม T9 อาจไม่เคยทำกับ iOS ในช่วงการปฏิวัติสมาร์ทโฟนอินพุต T9 ล้าสมัยเนื่องจากโทรศัพท์สมาร์ทโฟนรุ่นใหม่ต้องพึ่งพาคีย์บอร์ดเต็มรูปแบบโดยได้รับความอนุเคราะห์จากหน้าจอสัมผัส เนื่องจาก Apple ไม่เคยมีโทรศัพท์ที่มีแป้นพิมพ์จริงและไม่ได้อยู่ในธุรกิจโทรศัพท์ในช่วงรุ่งเรืองของ T9 จึงเป็นที่เข้าใจได้ว่าเทคโนโลยีนี้ถูกละเว้นจาก iOS

T9 ยังคงใช้กับโทรศัพท์ราคาไม่แพงบางรุ่นที่ไม่มีหน้าจอสัมผัส (ที่เรียกว่าฟีเจอร์โฟน) อย่างไรก็ตามแม้ว่าโทรศัพท์ Android ส่วนใหญ่ไม่เคยมีแป้นพิมพ์จริง แต่อุปกรณ์ Android ที่ทันสมัยรองรับการป้อนข้อมูล T9 ซึ่งสามารถใช้เพื่อโทรออกโดยการสะกดชื่อของผู้ติดต่อที่พยายามโทร



ตัวอย่างของ T9 Predictive Input ในการดำเนินการ

ในโทรศัพท์ที่มีแป้นพิมพ์ตัวเลขทุกครั้งที่กดแป้น (1-9) (เมื่ออยู่ในช่องข้อความ) อัลกอริทึมจะส่งคืนการคาดเดาว่าตัวอักษรใดน่าจะเป็นไปได้มากที่สุดสำหรับปุ่มที่กดไปที่

ภาพหน้าจอ Xcode



ตัวอย่างเช่นในการป้อนคำว่า 'the' ผู้ใช้จะกด 8 แล้ว 4 ตามด้วย 3 และหน้าจอจะแสดง 't' ตามด้วย 'th' และ 'the.' หากมีจุดประสงค์เพื่อใช้คำว่า“ fore” ที่ไม่ค่อยพบบ่อย (3673) อัลกอริทึมการคาดคะเนอาจเลือก“ Ford” การกดปุ่ม 'ถัดไป' (โดยทั่วไปคือปุ่ม '*') อาจทำให้เกิด 'ปริมาณ' และสุดท้ายคือ 'ก่อนหน้า' หากเลือก“ fore” ในครั้งถัดไปที่ผู้ใช้กดลำดับ 3673 fore จะมีแนวโน้มที่จะเป็นคำแรกที่แสดงขึ้น อย่างไรก็ตามหากใช้คำว่า“ Felix” เมื่อเข้าสู่ 33549 หน้าจอจะแสดง“ E” ตามด้วย“ De”“ Del”“ Deli” และ“ Felix”

นี่คือตัวอย่างของตัวอักษรที่เปลี่ยนขณะป้อนคำ



การใช้ T9 แบบเป็นโปรแกรมใน iOS

ดังนั้นมาเจาะลึกฟีเจอร์นี้และเขียนตัวอย่างง่ายๆของอินพุต T9 สำหรับ iOS ก่อนอื่นเราต้องสร้างโครงการใหม่

ข้อกำหนดเบื้องต้นที่จำเป็นสำหรับโครงการของเราเป็นพื้นฐาน: เครื่องมือสร้าง Xcode และ Xcode ที่ติดตั้งบน Mac ของคุณ



หากต้องการสร้างโครงการใหม่ให้เปิดไฟล์ แอปพลิเคชัน Xcode บน Mac ของคุณแล้วเลือก“ สร้างโปรเจ็กต์ Xcode ใหม่” จากนั้นตั้งชื่อโปรเจ็กต์ของคุณและเลือกประเภทแอพพลิเคชั่นที่จะสร้าง เพียงเลือก“ แอพ Single View” แล้วกด Next

ภาพหน้าจอ Xcode

ในหน้าจอถัดไปดังที่คุณเห็นจะมีข้อมูลบางอย่างที่คุณต้องให้

บันทึก: หากคุณไม่มีบัญชีนักพัฒนาคุณสามารถเรียกใช้สิ่งนี้บน Simulator ได้เช่นกัน

กดปุ่มถัดไปและเราก็พร้อมที่จะเริ่ม

สถาปัตยกรรมที่เรียบง่าย

ดังที่คุณทราบแล้วเมื่อคุณสร้างแอปใหม่คุณมี MainViewController แล้ว ชั้นเรียนและ Main.Storyboard. สำหรับวัตถุประสงค์ในการทดสอบแน่นอนว่าเราสามารถใช้คอนโทรลเลอร์นี้ได้

ก่อนที่เราจะเริ่มออกแบบอะไรบางอย่างก่อนอื่นเรามาสร้างคลาสและไฟล์ที่จำเป็นทั้งหมดเพื่อให้แน่ใจว่าเราได้ตั้งค่าและเรียกใช้งานทุกอย่างเพื่อย้ายไปยังส่วน UI ของงาน

ที่ไหนสักแห่งในโครงการของคุณเพียงสร้างไฟล์ใหม่ชื่อ“ PhoneContactsStore.swift 'ในกรณีของฉันมันเป็นแบบนี้

T9 ค้นหา storboard และสถาปัตยกรรม

ลำดับแรกของธุรกิจคือการสร้างแผนที่ที่มีอินพุตแป้นพิมพ์ตัวเลขทุกรูปแบบ

import Contacts import UIKit fileprivate 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' ]

แค่นั้นแหละ. เราได้ใช้แผนที่ที่สมบูรณ์พร้อมรูปแบบทั้งหมด ตอนนี้เรามาสร้างคลาสแรกของเราชื่อว่า“ โทรศัพท์ติดต่อ .”

ไฟล์ของคุณควรมีลักษณะดังนี้:

ข้อความแสดงแทนรูปภาพ

อันดับแรกในคลาสนี้เราต้องแน่ใจว่าเรามี Regex Filter จาก A-Z + 0-9

private let regex = try! NSRegularExpression(pattern: '[^ a-z()0-9+]', options: .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) } }

ตรวจสอบให้แน่ใจว่าคุณได้ลบล้าง hash และ isEqual เพื่อระบุตรรกะที่คุณกำหนดเองสำหรับการกรองรายการ

นอกจากนี้เราจำเป็นต้องมีวิธีการแทนที่เพื่อหลีกเลี่ยงการมีอะไรเลยยกเว้นตัวเลขในสตริง

override var hash: Int { get { return self.phoneNumber.hash } } override func isEqual(_ object: Any?) -> Bool { if let obj = object as? 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 เพื่อค้นหาผู้ติดต่อที่เกี่ยวข้องกับ fullname หรือ phonenumber.

func calculateT9() { for c in self.replace(str: self.fullName) { t9String.append(T9Map[String(c).localizedLowercase] ?? String(c)) } for c in 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 ซึ่งหมายความว่าเราเก็บไว้ในหน่วยความจำจนกว่าแอปจะทำงาน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Singletons หรือรูปแบบการออกแบบคุณสามารถอ่านได้ ที่นี่ .

ตอนนี้เราใกล้จะเสร็จสิ้นการค้นหา T9 แล้ว

วางมันทั้งหมดเข้าด้วยกัน

ก่อนที่คุณจะเข้าถึงรายชื่อผู้ติดต่อบน Apple คุณต้องขออนุญาตก่อน

class func hasAccess() -> Bool { let authorizationStatus = CNContactStore.authorizationStatus(for: CNEntityType.contacts) return authorizationStatus == .authorized } class func requestForAccess(_ completionHandler: @escaping (_ accessGranted: Bool, _ error : CustomError?) -> Void) { let authorizationStatus = CNContactStore.authorizationStatus(for: CNEntityType.contacts) switch authorizationStatus { case .authorized: self.instance.loadAllContacts() completionHandler(true, nil) case .denied, .notDetermined: weak var wSelf = self.instance self.instance.contactsStore.requestAccess(for: CNEntityType.contacts, completionHandler: { (access, accessError) -> Void in var err: CustomError? if let e = accessError { err = CustomError(description: e.localizedDescription, code: 0) } else { wSelf?.loadAllContacts() } completionHandler(access, err) }) default: completionHandler(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 {} // Fallback on earlier versions try self.contactsStore.enumerateContacts(with: request, usingBlock: {(contact, ok) in DispatchQueue.main.async { for phone in contact.phoneNumbers { let local = PhoneContact() local.firstName = contact.givenName local.lastName = contact.familyName if let data = contact.thumbnailImageData { local.image = UIImage(data: data) } var phoneNum = phone.value.stringValue let strArr = phoneNum.components(separatedBy: CharacterSet.decimalDigits.inverted) phoneNum = NSArray(array: strArr).componentsJoined(by: '') local.phoneNumber = phoneNum local.calculateT9() self.dataSource.insert(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 request = CNContactFetchRequest(keysToFetch: []) var count = 0; do { try self.instance.contactsStore.enumerateContacts( with: request, usingBlock: {(contact, ok) in count += 1; }) } catch {} return count }

แค่นั้นแหละ. เราทำเสร็จแล้ว

ตอนนี้เราสามารถใช้ T9 ค้นหาภายใน UIViewController

fileprivate let cellIdentifier = 'contact_list_cell' final class ViewController: UIViewController { @IBOutlet weak var tableView: UITableView! @IBOutlet weak var searchBar: UISearchBar! fileprivate lazy 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.keyboardType = .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) }

การใช้วิธีการโหลดรายการซ้ำ:

func reloadListSection(section: Int, animation: UITableViewRowAnimation = .none) { if self.tableView.numberOfSections <= section { self.tableView.beginUpdates() self.tableView.insertSections(IndexSet(integersIn:0..

และนี่คือส่วนสุดท้ายของบทแนะนำสั้น ๆ ของเรา UITableView การใช้งาน:

extension ViewController: UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { return tableView.dequeueReusableCell(withIdentifier: 'ContactListCell')! } func numberOfSections(in 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 ได้ที่ my GitHub repo .

ทำความเข้าใจพื้นฐาน

ข้อความคาดเดาคืออะไร?

Predictive text เป็นเทคโนโลยีการป้อนข้อมูลที่ปุ่มหรือปุ่มหนึ่งปุ่มแทนตัวอักษรหลายตัวเช่นบนแป้นพิมพ์ตัวเลขที่ใช้กับโทรศัพท์มือถือรุ่นเก่า นอกจากนี้ยังใช้เพื่อปรับปรุงความสามารถในการเข้าถึงในบางสถานการณ์

ทำไม T9 ถึงเรียกอย่างนั้น?

T9 ย่อมาจาก Text on 9 keys เนื่องจากใช้แป้นตัวเลข 9 หลักในการป้อนข้อความ

ฉันจะใช้ T9 บนแป้นพิมพ์ได้อย่างไร

นี่คือตัวอย่างสั้น ๆ สำหรับ 'HELLO' คุณจะต้องกด 4-3-5-5-6 เท่านั้น นี่คือตัวเลขที่มีตัวอักษรที่สะกดว่า 'HELLO'

.fullName.lowercased() .contains(str.lowercased()) }) } class func count() -> Int { let request = CNContactFetchRequest(keysToFetch: []) var count = 0; do { try self.instance.contactsStore.enumerateContacts( with: request, usingBlock: {(contact, ok) in count += 1; }) } catch {} return count }

แค่นั้นแหละ. เราทำเสร็จแล้ว

ตอนนี้เราสามารถใช้ T9 ค้นหาภายใน UIViewController

fileprivate let cellIdentifier = 'contact_list_cell' final class ViewController: UIViewController { @IBOutlet weak var tableView: UITableView! @IBOutlet weak var searchBar: UISearchBar! fileprivate lazy 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.keyboardType = .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) }

การใช้วิธีการโหลดรายการซ้ำ:

func reloadListSection(section: Int, animation: UITableViewRowAnimation = .none) { if self.tableView.numberOfSections <= section { self.tableView.beginUpdates() self.tableView.insertSections(IndexSet(integersIn:0..

และนี่คือส่วนสุดท้ายของบทแนะนำสั้น ๆ ของเรา UITableView การใช้งาน:

extension ViewController: UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { return tableView.dequeueReusableCell(withIdentifier: 'ContactListCell')! } func numberOfSections(in 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 ได้ที่ my GitHub repo .

ทำความเข้าใจพื้นฐาน

ข้อความคาดเดาคืออะไร?

Predictive text เป็นเทคโนโลยีการป้อนข้อมูลที่ปุ่มหรือปุ่มหนึ่งปุ่มแทนตัวอักษรหลายตัวเช่นบนแป้นพิมพ์ตัวเลขที่ใช้กับโทรศัพท์มือถือรุ่นเก่า นอกจากนี้ยังใช้เพื่อปรับปรุงความสามารถในการเข้าถึงในบางสถานการณ์

ทำไม T9 ถึงเรียกอย่างนั้น?

T9 ย่อมาจาก Text on 9 keys เนื่องจากใช้แป้นตัวเลข 9 หลักในการป้อนข้อความ

ฉันจะใช้ T9 บนแป้นพิมพ์ได้อย่างไร

นี่คือตัวอย่างสั้น ๆ สำหรับ 'HELLO' คุณจะต้องกด 4-3-5-5-6 เท่านั้น นี่คือตัวเลขที่มีตัวอักษรที่สะกดว่า 'HELLO'