textDocumentProxy仅适用于KeyboardViewController.swift?

时间:2015-04-04 03:24:44

标签: ios swift

我正在尝试创建一个自定义键盘扩展程序,该扩展程序会推送到另一个UIViewController,其中包含可插入所选文本字段的文本列表。它是UIInputViewController的子类。但是,当我尝试使用textDocumentProxydidSelectRowAtIndexPath()上输入文字时似乎没有发生任何事情。

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

}

2 个答案:

答案 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)
    }
}