ios - 如何在自定义应用内键盘(Swift 4)中链接 XIB 按钮
问题描述
我刚刚创建了一个应用内自定义键盘,完成了所有困难的事情,但现在被难住了(这可能是微不足道的):
如何连接 XIB 的按钮及其关联类,以便将适当的文本输入到 viewController 上的 UITextView 中。
我创建了一个带有键盘的 XIB,以便我可以在不同的控制器中重复使用相同的键盘。设置所有约束、类、文件所有者等。一切正常 - 除了从键获取数据到视图。
这是我所拥有的:
class ViewController: UIViewController, UITextViewDelegate {
@IBOutlet weak var inputField: UITextView!
@IBOutlet weak var customKeyboard: UIView!
override func viewDidLoad() {
super.viewDidLoad()
inputField.delegate = self
}
}
class CustomKeyboard: UIView {
@IBOutlet var contentView: UIView!
@IBOutlet weak var key1: UIButton!
@IBOutlet weak var key2: UIButton!
// etc.
@IBOutlet weak var keyReturn: UIButton!
@IBOutlet weak var keyDelete: UIButton!
override init(frame: CGRect) {
// for using the custom view in code
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
// for using the custom view in IB
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
Bundle.main.loadNibNamed("CustomKeyboard", owner: self, options: nil)
contentView.frame = self.bounds
contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
contentView.translatesAutoresizingMaskIntoConstraints = true
addSubview(contentView)
}
@IBAction func key1(_ sender: UIButton) {
}
@IBAction func key2(_ sender: UIButton) {
}
// etc.
@IBAction func keyReturn(_ sender: UIButton) {
}
@IBAction func keyDelete(_ sender: UIButton) {
}
}
在我尝试的 CustomKeyboard 类中:
@IBAction func key1(_ sender: UIButton) {
if let selectedRange: UITextRange = inputField.selectedTextRange {
inputField.replace(selectedRange, withText: "1")
}
}
@IBAction func keyDelete(_ sender: UIButton) {
inputField.deleteBackward()
}
但显然, inputField 属于 ViewController 而不是 CustomKeyboard 类,所以我得到一个错误。
那么,如何让在 CustomKeyboard XIB/class 上单击的字符输入到 ViewController 中的 textView 中?
解决方案
原来我只需要使用一个委托。将 XIB 中的所有按钮连接到keyTapped
函数后:
class ViewController: UIViewController, UITextViewDelegate, KeyboardDelegate {
@IBOutlet weak var inputField: UITextView!
@IBOutlet weak var customKeyboard: CustomKeyboard!
override func viewDidLoad() {
super.viewDidLoad()
inputField.delegate = self
inputField.inputView = UIView()
customKeyboard.delegate = self
}
func keyWasTapped(character: String) {
if character == "⌫" {
inputField.deleteBackward()
}
else if character == "⏎" {
inputField.insertText("\n")
}
else {
inputField.insertText(character)
}
}
protocol KeyboardDelegate: class {
func keyWasTapped(character: String)
}
class CustomKeyboard: UIView {
weak var delegate: KeyboardDelegate?
@IBOutlet var contentView: UIView!
@IBOutlet weak var key1: UIButton!
@IBOutlet weak var key2: UIButton!
// etc.
@IBOutlet weak var keyReturn: UIButton!
@IBOutlet weak var keyDelete: UIButton!
override init(frame: CGRect) {
// for using the custom view in code
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
// for using the custom view in IB
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
Bundle.main.loadNibNamed("CustomKeyboard", owner: self, options: nil)
contentView.frame = self.bounds
contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
contentView.translatesAutoresizingMaskIntoConstraints = true
addSubview(contentView)
}
@IBAction func keyTapped(sender: UIButton) {
// When a button is tapped, send that information to the
// delegate (ie, the view controller)
self.delegate?.keyWasTapped(character: sender.titleLabel!.text!)
}
@IBAction func key1(_ sender: UIButton) {
}
@IBAction func key2(_ sender: UIButton) {
}
// etc.
@IBAction func keyReturn(_ sender: UIButton) {
}
@IBAction func keyDelete(_ sender: UIButton) {
}
}
推荐阅读
- swift - 为什么我不能在 Swift.Result 中使用我的错误协议
- amazon-web-services - DynamoDB 流和全局表 - 重复状态更改
- sharepoint - Power BI - 关于本地和云数据源的问题
- nginx - Nagios nginx centos 7 / 403 禁止错误
- azure-devops - Azure Dev Ops 构建失败
- java - 无论之前的任务完成状态如何,ScheduledExecutorService 都会执行
- java - openshift sso如何使用api注销
- html - 带有内部尾随空间的内联元素会删除兄弟姐妹之间的空间吗?
- perl - 如何在 Perl 中获取数组的数组?
- ruby-on-rails - Savon 不使用参数填充 XML