iOS自定义键盘制作删除所有按钮
Posted
技术标签:
【中文标题】iOS自定义键盘制作删除所有按钮【英文标题】:iOS custom keyboard make a delete all button 【发布时间】:2016-06-21 17:06:55 【问题描述】:目前我的 ios 自定义键盘有一个全部删除按钮。这是点击时的代码:
func deletekeyPressed(sender: UIButton!)
for _ in 1..<10000
(textDocumentProxy as UIKeyInput).deleteBackward()
问题是,每当我单击按钮时,在删除所有文本之前都会出现明显的停顿。我很确定这是因为我打电话给deleteBackward()
10000 次。
有没有更快的方法来删除所有的文字?
【问题讨论】:
你不能把UITextView
/UITextField
的text
属性设置为一个空字符串吗?
另外,这个问题与自定义键盘无关。这只是关于UIDocument
s 和UITextView
s。
它与自定义键盘有关。我正在制作一个应用程序扩展,它是一个为用户安装自定义键盘的应用程序,用户可以在任何他们想要的地方使用它。因此,我无法访问 UITextfield 对象,因为自定义键盘与文本交互的方式有限
那你应该解释说你无权访问文本字段。
我已经解释过我正在制作一个 IOS 自定义键盘,这意味着您无法访问文本字段。
【参考方案1】:
如果您调用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 事件,它可能会失败。
【讨论】:
以上是关于iOS自定义键盘制作删除所有按钮的主要内容,如果未能解决你的问题,请参考以下文章