Ios 在应用程序中使用自定义InputViewController

Ios 在应用程序中使用自定义InputViewController,ios,ios-keyboard-extension,textdocumentproxy,Ios,Ios Keyboard Extension,Textdocumentproxy,我目前的任务是iOS键盘扩展。现在,为了通过应用商店审查,包含应用的应用必须提供一些“真实”的内容。我考虑让用户在设置中启用键盘之前测试它。所以我的故事板看起来像这样(简化为显示相关内容): 这可以正常工作,键盘显示在容器中,但是-由于键盘的视图控制器中的textDocumentProxy对象没有附加任何内容-用户无法看到他/她正在键入的内容 现在,我正在寻找一种将键盘“附加”到文本字段的方法,同时不让系统键盘妨碍用户输入自定义键盘 我已经通过将以下功能附加到文本字段的编辑开始操作,成功地将系统

我目前的任务是iOS键盘扩展。现在,为了通过应用商店审查,包含应用的应用必须提供一些“真实”的内容。我考虑让用户在设置中启用键盘之前测试它。所以我的故事板看起来像这样(简化为显示相关内容):

这可以正常工作,键盘显示在容器中,但是-由于键盘的视图控制器中的
textDocumentProxy
对象没有附加任何内容-用户无法看到他/她正在键入的内容

现在,我正在寻找一种将键盘“附加”到文本字段的方法,同时不让系统键盘妨碍用户输入自定义键盘

我已经通过将以下功能附加到文本字段的
编辑开始操作,成功地将系统键盘移走

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

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

我创建了一个实现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()
    }

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

它可能看起来有点黑客,可能有更好的解决方案(请随意告诉我),但这是有效的,因此我使用了它

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

}