Как вводить текст с помощью кнопок пользовательской клавиатуры в приложении

Я создал пользовательскую клавиатуру в приложении, которая заменяет системную клавиатуру и появляется, когда я нажимаю .

введите описание изображения здесь

Вот мой код:

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 файла.

Вопрос

Как получить текст кнопки в текстовое поле?

Примечания:

Обновление

  • Этот учебник, кажется, указывает на наличие контроллера представления для пользовательского представления ввода. Тем не менее, я теряюсь в коде Objective-C. Каким будет процесс в Swift?
  • В этом ответе упоминается протокол UIKeyInput, который соответствует UITextField, но как его использовать?
  • Если какой-либо встроенный способ сделать обычную клавиатуру в приложении, я бы предпочел это сделать обычное пользовательское представление.

Ответ 1

Настройка

  • Создайте файл xib, который включает все ваши ключи
  • Используйте Autolayout, чтобы клавиши изменяли размер до нужных пропорций, независимо от того, насколько велика клавиатура для установки позже.
  • Создайте файл swift с тем же именем, что и файл xib, и установите его как владельца файла в настройке файла xib.

    введите описание изображения здесь

    введите описание изображения здесь введите описание изображения здесь

  • Подключите все кнопки кнопок к методу IBAction в файле swift. (См. Код ниже.)

Код

Я использую шаблон делегирования для связи между пользовательским видом клавиатуры и основным контроллером. Это позволяет их развязать. Несколько разных пользовательских клавиатур можно было бы менять и изменять без необходимости изменения детального кода реализации в главном контроллере представления.

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)
    }

}

Источники

Связанные

Ответ 2

Я представляю себе что-то вроде этого:

Новая функция для обработки события кнопки

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)}