如何使用应用内自定义键盘的buttoninput文本
我做了一个应用内自定义键盘,取代了系统键盘,当我点击一个UITextField
时popup。
这是我的代码:
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 } }
键盘布局从xib文件加载。
题
如何获取button文本到文本字段?
笔记:
- 有很多关于制作自定义系统键盘(需要安装)的教程,但我只想要一个应用程序内键盘。 这些教程只是为键盘使用一个特殊的视图控制器,但在这里,我似乎只是设置键盘视图。
- 我已阅读数据input文档的自定义视图 。
- 这是我能find的最接近的堆栈溢出问题,但是没有描述如何从button中获取文本。
更新
- 本教程似乎表明有自定义input视图的视图控制器。 但是,我迷失在Objective-C代码中。 Swift中的过程是什么?
- 这个答案提到了
UITextField
符合的UIKeyInput
协议,但是如何使用它呢? - 如果有任何内置的方式也使一个自定义的应用程序内键盘,我真的更喜欢做一个正常的自定义视图。
build立
- 制作一个包含所有密钥的
xib
文件 - 使用Autolayout,无论键盘稍后设置多大,按键都会调整到正确的比例。
-
创build一个与
xib
文件同名的xib
文件,并将其设置为xib
文件设置中的文件所有者。 -
将所有按键连接到
swift
文件中的IBAction方法。 (请参阅下面的代码。)
码
我正在使用委托模式在自定义键盘视图和主视图控制器之间进行通信。 这可以使它们分离。 多个不同的自定义键盘可以交换进出,无需在主视图控制器中更改详细的实现代码。
Keyboard.swift
文件
import UIKit protocol KeyboardDelegate { func keyWasTapped(character: String) } 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!) } }
主视图控制器
请注意, ViewController
符合我们创build的KeyboardDelegate
协议。 而且,在创build键盘视图的实例时,需要设置height
,但width
不是。 显然设置文本字段的inputView
键盘视图宽度更新为屏幕宽度,这很方便。
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: String) { textField.insertText(character) } }
来源
- @ ryancrunchi的评论中的build议是有帮助的。
- 这个答案从xib创build一个可重复使用的UIView(和从故事板加载)
有关
- 数据input自定义视图的Swift示例(自定义应用程序内键盘)
我想像这样的事情:
处理button事件的新函数
func updateTextfield(sender: UIButton) { textField.text = (textField.text ?? "") + (sender.titleForState(.Normal) ?? "") }
初始化您的自定义键盘后,注册button:
myCustomKeyboard.subviews .filter { $0 as? UIButton != nil } // Keep the buttons only .forEach { ($0 as! UIButton).addTarget(self, action: "updateTextfield", forControlEvents: .TouchUpInside)}