目前我的iOS自定义键盘有一个全部删除按钮。点击时是以下代码:
func deletekeyPressed(sender: UIButton!) {
for _ in 1..<10000 {
(textDocumentProxy as UIKeyInput).deleteBackward()
}
}
问题是,每当我点击按钮时,在删除所有文本之前会有明显的暂停。我很确定这是因为我呼叫deleteBackward()
10000次。
是否有更快的方式删除所有文字?
答案 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事件,它可能会失败。