我正在尝试创建一个自定义键盘扩展程序,该扩展程序会推送到另一个UIViewController
,其中包含可插入所选文本字段的文本列表。它是UIInputViewController
的子类。但是,当我尝试使用textDocumentProxy
在didSelectRowAtIndexPath()
上输入文字时似乎没有发生任何事情。
textDocumentProxy
仅适用于生成的默认KeyboardViewController.swift
文件,还是我能够创建另一个UIViewController
子类UIInputViewController
来插入文本?我的最后一招是使用委托或创建一个将在KeyboardViewController.swift
中调用函数的监听器,但我只是想知道是否有人知道更好的方法。
提前致谢!
代码示例如下所示:
import UIKit
class AnotherInputViewController: UIInputViewController, UITableViewDelegate, UITableViewDataSource {
...
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: false)
var proxy = textDocumentProxy as UITextDocumentProxy
if let input = arrayTextToInput[indexPath.row] as? String {
proxy.insertText(input)
}
}
}
答案 0 :(得分:0)
以防任何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)
}
}
希望它有所帮助!
答案 1 :(得分:0)
我遇到了同样的问题,并使用了委托来解决。
将插入文本的操作传递到KeyboardViewController
首先创建委托
protocol UITextDocumentProxyDelegate: AnyObject {
func insertText(_ text: String)
}
,然后在AnotherInputViewController
中创建类型为delegate
的变量UITextDocumentProxyDelegate
weak var delegate: 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
方法
extension KeyboardViewController: UITextDocumentProxyDelegate {
func insertText(_ text: String) {
proxy.insertText(text)
}
}