首页 > 解决方案 > 如何在自定义应用内键盘(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 中?

标签: iosswift

解决方案


原来我只需要使用一个委托。将 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) {
    }
}

推荐阅读