如何使用应用内自定义键盘的按钮输入文本

时间:2015-11-03 11:12:37

标签: ios swift keyboard

我制作了一个应用内自定义键盘,用于替换系统键盘,当我点击UITextField时,会弹出。

enter image description here

这是我的代码:

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文件加载的。

问题

如何将按钮文本输入文本字段?

备注:

  • 有许多关于制作自定义系统键盘的教程(需要安装),但我只想要一个应用内键盘。教程仅使用键盘的特殊视图控制器,但这里似乎只是设置键盘视图。
  • 我已阅读Custom Views for Data Input文档。
  • This是我能找到的最接近的Stack Overflow问题,但它没有描述如何从按钮中获取文本。

更新

  • This tutorial似乎表明自定义输入视图有一个视图控制器。但是,我在Objective-C代码中迷失了方向。 Swift中的过程是什么?
  • This answer提及UIKeyInput符合的UITextField协议,但我该如何使用?
  • 如果有任何内置方式也可以制作自定义应用内键盘,我真的更喜欢制作一个普通的自定义视图。

2 个答案:

答案 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文件
  • 使用Autolayout,无论键盘设置得多大,按键都会调整到正确的比例。
  • 创建一个与swift文件同名的xib文件,并将其设置为xib文件设置中的文件所有者。

    enter image description here

    enter image description here enter image description here

  • 将所有关键按钮连接到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)
    }

}

来源

相关