1

我目前的任务是 iOS 键盘扩展。现在,要通过 App Store Review,包含应用程序必须提供一些“真实”内容。我想过让用户在“设置”中启用它之前测试键盘。所以我的故事板看起来像这样(减少显示相关的东西):

└ ViewController
  └ View
    ├ TextField
    └ Keyboard Container
      └ KeyboardViewController

这一切正常,键盘显示在容器中,但是 - 由于textDocumentProxy键盘视图控制器中的对象没有附加到任何东西 - 用户看不到他/她正在输入的内容。

现在我正在寻找一种将键盘“附加”到文本字段的方法,同时保持系统键盘不受干扰,以便用户可以在自定义键盘上键入。

我已经设法通过将以下函数附加到文本字段的editing did begin操作来移除系统键盘。

@IBAction func editingBegan(sender: UITextField) {
    sender.endEditing(true)
}
4

1 回答 1

1

我设法找到以下解决方法:

我创建了一个实现 UITextDocumentProxy 协议的类,该协议写入文本字段,并将其设置为键盘视图控制器中的附加代理:

class ProxyWrapper: NSObject, UITextDocumentProxy {

    private let textField: UITextField

    init(textField: UITextField) {
        self.textField = textField
    }

    var documentContextBeforeInput: String? {
        get {
            return textField.text
        }
    }

    var documentContextAfterInput: String? {
        get {
            return ""
        }
    }

    func adjustTextPositionByCharacterOffset(offset: Int) {}

    func insertText(text: String) {
        let ntext = text.stringByReplacingOccurrencesOfString("\n", withString: "")
        textField.text = (textField.text ?? "") + ntext
    }

    func deleteBackward() {
        if let text = textField.text {
            textField.text = text.substringToIndex(text.endIndex.advancedBy(-1))
        }
    }

    func hasText() -> Bool {
        return textField.hasText()
    }

}

如您所见,我只实现了一个非常简约的类(仅在最后进行文本输入/删除),因为我完全禁用了文本字段的用户交互性,因此不会弹出“真正的”键盘。另外,我不允许插入换行符。

它可能看起来有点骇人听闻,并且可能有更好的解决方案(请随时告诉我),但这很有效,因此我使用了它。

于 2015-12-23T12:29:22.360 回答