Ios textDocumentProxy仅适用于KeyboardViewController.swift?
我正在尝试创建一个自定义键盘扩展,该扩展可推送到另一个UIViewController,该UIViewController具有可插入到所选文本字段的文本列表。它是UIInputViewController的子类。但是,当我尝试使用textDocumentProxy在DidSelectRowatineXpath上输入文本时,似乎什么都没有发生 textDocumentProxy是否仅适用于生成的默认KeyboardViewController.swift文件,或者我是否能够创建另一个UIViewController子类UIInputViewController以插入文本?我最后的办法是使用委托或创建一个侦听器来调用KeyboardViewController.swift中的函数,但我只是想看看是否有人知道更好的方法 提前谢谢 代码示例如下所示:Ios textDocumentProxy仅适用于KeyboardViewController.swift?,ios,swift,Ios,Swift,我正在尝试创建一个自定义键盘扩展,该扩展可推送到另一个UIViewController,该UIViewController具有可插入到所选文本字段的文本列表。它是UIInputViewController的子类。但是,当我尝试使用textDocumentProxy在DidSelectRowatineXpath上输入文本时,似乎什么都没有发生 textDocumentProxy是否仅适用于生成的默认KeyboardViewController.swift文件,或者我是否能够创建另一个UIViewC
以防任何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)
}
}