Если вы вызываете 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.
Не можете ли вы установить атрибут 'text' UITextView'/'UITextField' в пустую строку? – NRitH
Кроме того, этот вопрос не имеет ничего общего с пользовательскими клавиатурами. Речь идет только о 'UIDocument' и 'UITextView'. – NRitH
Он имеет все, что связано с пользовательскими клавиатурами. Я делаю расширения приложений, которое представляет собой приложение, которое устанавливает пользовательскую клавиатуру для пользователя, который пользователь может использовать там, где захочет. Таким образом, я не могу получить доступ к объекту UITextfield, потому что пользовательская клавиатура имела ограниченное количество способов взаимодействия с текстом. – Roymunson