Comment saisir du text en utilisant les buttons d'un keyboard personnalisé embedded à l'application

J'ai créé un keyboard personnalisé embedded à l'application qui remplace le keyboard du système et apparaît lorsque je UITextField dans un UITextField .

entrez la description de l'image ici

Voici mon code:

 class ViewController: UIViewController { var myCustomKeyboard: UIView! @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() let keyboardNib = UINib(nibName: "Keyboard", bundle: nil) myCustomKeyboard = keyboardNib.instantiateWithOwner(self, options: nil)[0] as! UIView textField.inputView = myCustomKeyboard } } 

La disposition du keyboard est chargée à partir d'un file xib.

Question

Comment puis-je get le text du button dans le champ de text?

Remarques:

  • Il existe de nombreux didacticiels sur la création d'un keyboard système personnalisé (qui doit être installé), mais je ne souhaite qu'un keyboard embedded à l'application. Les tutoriels utilisent un controller de vue spécial juste pour le keyboard, mais ici, il semble que je suis juste en train de régler la vue du keyboard.
  • J'ai lu la documentation Custom Views pour la saisie de données .
  • C'est la question de dépassement de stack la plus proche que j'ai pu find, mais elle ne va pas aussi loin que de décrire comment get le text à partir des buttons.

Mettre à jour

  • Ce tutoriel semble indiquer qu'il existe un controller de vue pour la vue d'input personnalisée. Cependant, je me perds dans le code Objective-C. Quel serait le process dans Swift?
  • Cette réponse mentionne le protocole UIKeyInput auquel UITextField conforme, mais comment l'utiliser?
  • S'il y a un moyen de créer un keyboard personnalisé dans l'application, je préfère vraiment faire une vue personnalisée normale.

Installer

  • Faites un file xib qui inclut toutes vos keys
  • Utilisez Autolayout pour que les touches soient redimensionnées dans les bonnes proportions, quelle que soit la taille du keyboard.
  • Créez un file swift portant le même nom que le file xib et définissez-le en tant que propriétaire du file dans le file xib .

    entrez la description de l'image ici

    entrez la description de l'image ici entrez la description de l'image ici

  • Reliez tous les buttons keys à une méthode IBAction dans le file swift . (Voir le code ci-dessous.)

Code

J'utilise le model de délégué pour communiquer entre la vue de keyboard personnalisée et le controller de vue principale. Cela leur permet d'être découplés. Plusieurs keyboards personnalisés différents peuvent être échangés dedans et dehors sans avoir besoin de changer le code d'implémentation détaillé dans le controller de la vue principale.

Fichier Keyboard.swift

 import UIKit protocol KeyboardDelegate { func keyWasTapped(character: Ssortingng) } class Keyboard: UIView { var delegate: KeyboardDelegate? required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) initializeSubviews() } override init(frame: CGRect) { super.init(frame: frame) initializeSubviews() } func initializeSubviews() { let xibFileName = "Keyboard" // xib extention not needed let view = NSBundle.mainBundle().loadNibNamed(xibFileName, owner: self, options: nil)[0] as! UIView self.addSubview(view) view.frame = self.bounds } @IBAction func keyTapped(sender: UIButton) { self.delegate?.keyWasTapped(sender.titleLabel!.text!) } } 

Contrôleur de la vue principale

Notez que ViewController est conforme au protocole KeyboardDelegate que nous avons créé. De même, lors de la création d'une instance de la vue du keyboard, la height doit être définie mais pas la width . Apparemment, la définition de l' inputView du champ de text met à jour la largeur de la vue du keyboard à la largeur de l'écran, ce qui est pratique.

 class ViewController: UIViewController, KeyboardDelegate { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() // get an instance of the Keyboard (only the height is important) let keyboardView = Keyboard(frame: CGRect(x: 0, y: 0, width: 0, height: 300)) // use the delegate to communicate keyboardView.delegate = self // replace the system keyboard with the custom keyboard textField.inputView = keyboardView } // required method for keyboard delegate protocol func keyWasTapped(character: Ssortingng) { textField.insertText(character) } } 

Sources

  • Les suggestions dans le commentaire de @ ryancrunchi ont été utiles.
  • Cette réponse de Créer un UIView réutilisable avec xib (et chargement à partir du storyboard)

en relation

  • Un exemple rapide de vues personnalisées pour la saisie de données (keyboard personnalisé embedded à l'application)

J'imagine quelque chose comme ça:

Une nouvelle fonction pour gérer l'événement de button

 func updateTextfield(sender: UIButton) { textField.text = (textField.text ?? "") + (sender.titleForState(.Normal) ?? "") } 

Et après avoir init votre keyboard personnalisé, enregistrez les buttons:

 myCustomKeyboard.subviews .filter { $0 as? UIButton != nil } // Keep the buttons only .forEach { ($0 as! UIButton).addTarget(self, action: "updateTextfield", forControlEvents: .TouchUpInside)}