Ios textDocumentProxy仅适用于KeyboardViewController.swift?

Ios textDocumentProxy仅适用于KeyboardViewController.swift?,ios,swift,Ios,Swift,我正在尝试创建一个自定义键盘扩展,该扩展可推送到另一个UIViewController,该UIViewController具有可插入到所选文本字段的文本列表。它是UIInputViewController的子类。但是,当我尝试使用textDocumentProxy在DidSelectRowatineXpath上输入文本时,似乎什么都没有发生 textDocumentProxy是否仅适用于生成的默认KeyboardViewController.swift文件,或者我是否能够创建另一个UIViewC

我正在尝试创建一个自定义键盘扩展,该扩展可推送到另一个UIViewController,该UIViewController具有可插入到所选文本字段的文本列表。它是UIInputViewController的子类。但是,当我尝试使用textDocumentProxy在DidSelectRowatineXpath上输入文本时,似乎什么都没有发生

textDocumentProxy是否仅适用于生成的默认KeyboardViewController.swift文件,或者我是否能够创建另一个UIViewController子类UIInputViewController以插入文本?我最后的办法是使用委托或创建一个侦听器来调用KeyboardViewController.swift中的函数,但我只是想看看是否有人知道更好的方法

提前谢谢

代码示例如下所示:


以防任何noobie使用键盘API扩展再次遇到此问题

我刚刚将KeyboardViewController对象注入到我演示的视图控制器中,如下所示:

//within KeyboardViewController.swift

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: false)
    let nextVC: NextViewController = NextViewController(keyboardVC: self.keyboardVC)
    self.presentViewController(nextVC, animated: true, completion: nil)
}
然后用KeyboardViewController初始化nextVC

//class NextViewController

var keyboardVC: KeyboardViewController

init(keyboardVC: KeyboardViewController) {
    self.keyboardVC = keyboardVC
    super.init(nibName: nil, bundle: nil);
}

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
从那里,您可以访问keyboardVC,并可以使用该对象调用方法将文本插入到您希望的任何字段中。例如

 call keyboardVC.addText(input) from wherever you want

 //class KeyboardViewController.swift
 func addText(input: String) {
    if let textDocumentProxy = self.textDocumentProxy as? UITextDocumentProxy {
        textDocumentProxy.insertText(input)
    }
}

希望有帮助

我也面临同样的问题,我通过授权解决了这个问题。 其中,将插入文本的操作传递给KeyboardViewController

//class NextViewController

var keyboardVC: KeyboardViewController

init(keyboardVC: KeyboardViewController) {
    self.keyboardVC = keyboardVC
    super.init(nibName: nil, bundle: nil);
}

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
首先创建委托

protocol UITextDocumentProxyDelegate: AnyObject {
    func insertText(_ text: String)
}
,然后在另一个InputViewController中创建UITextDocumentProxyDelegate类型的变量委托

并将代码替换为

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: false)

    if let input = arrayTextToInput[indexPath.row] as? String {
        delegate?.insertText(input)
    }
}
,最后在KeyboardViewController中遵循UITextDocumentProxyDelegate协议并实现insertText方法


回答我自己的问题,以防有人再次遇到这个问题。。。
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: false)

    if let input = arrayTextToInput[indexPath.row] as? String {
        delegate?.insertText(input)
    }
}
extension KeyboardViewController: UITextDocumentProxyDelegate {
    func insertText(_ text: String) {
        proxy.insertText(text)
    }
}