我制作了一个应用内自定义键盘,用于替换系统键盘,当我点击UITextField
时,会弹出。
这是我的代码:
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文件加载的。
如何将按钮文本输入文本字段?
备注:
更新
UIKeyInput
符合的UITextField
协议,但我该如何使用?答案 0 :(得分:4)
我想象这样的事情:
处理按钮事件的新功能
func updateTextfield(sender: UIButton) {
textField.text = (textField.text ?? "") + (sender.titleForState(.Normal) ?? "")
}
在初始化自定义键盘后,注册按钮:
myCustomKeyboard.subviews
.filter { $0 as? UIButton != nil } // Keep the buttons only
.forEach { ($0 as! UIButton).addTarget(self, action: "updateTextfield", forControlEvents: .TouchUpInside)}
答案 1 :(得分:4)
xib
文件创建一个与swift
文件同名的xib
文件,并将其设置为xib
文件设置中的文件所有者。
将所有关键按钮连接到swift
文件中的IBAction方法。 (参见下面的代码。)
我使用delegate pattern在自定义键盘视图和主视图控制器之间进行通信。这允许它们分离。可以交换多个不同的自定义键盘,而无需更改主视图控制器中的详细实现代码。
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
符合我们创建的KeyboardDelegate
协议。此外,在创建键盘视图的实例时,需要设置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)
}
}