iOS自定义键盘删除所有按钮

时间:2016-06-21 17:06:55

标签: ios swift ios-app-extension custom-keyboard

目前我的iOS自定义键盘有一个全部删除按钮。点击时是以下代码:

func deletekeyPressed(sender: UIButton!) {

    for _ in 1..<10000 {
        (textDocumentProxy as UIKeyInput).deleteBackward()
    }

}

问题是,每当我点击按钮时,在删除所有文本之前会有明显的暂停。我很确定这是因为我呼叫deleteBackward() 10000次。

是否有更快的方式删除所有文字?

1 个答案:

答案 0 :(得分:0)

如果您调用deleteBackwards 10000次,这意味着必须将10000个deleteBackwards命令序列化为某些表示形式,这些表示形式可以通过XPC传输,发送到主机进程,反序列化,然后应用。这可能是您延迟的原因。

我会将你的deleteBackwards个调用批量删除不超过当前文档上下文的块,然后等待下一个textDidChange调用,如果它在最后一个调用的X毫秒内,则删除一些更多新的上下文,因为您可以相当确定用户在按下按钮后不会很快点击其他文本字段。

下面是一些虚假代码,它展示了我的意思。

var lastDeleteAllPressed: Double
let threshHold = 0.1 // you'll need to test on a real device to get a real value for this.
func textDidChange() {
  //whatever else you need to do
  if CACurrentMediaTime - lastDeleteAllPressed < threshHold && !proxy.isEmpty {
    deleteKeyPressed() 
  }
}
func deleteKeyPressed() {

    let length = proxy.contextBeforeInput.append(proxy.contextAfterInput).length
    0...length.forEach { deleteBackwards() }
    lastDeleteAllPressed = CACurrentMediaTime()
}

这种方法的好处是不做不必要的工作,即使用户正在编辑的文档中有超过10000个字符,也可以工作。缺点是如果主机进程花费不自然的长时间发回textDidChange事件,它可能会失败。