2016-06-21 12 views
0

В настоящее время на моей пользовательской клавиатуре iOS есть кнопка «Удалить все». Вот его код при нажатии:Пользовательская клавиатура iOS удаляет все кнопки

func deletekeyPressed(sender: UIButton!) { 

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

} 

Проблема заключается в том, всякий раз, когда я нажимаю кнопку существует заметная пауза перед тем весь текст будет удален. Я уверен, что это потому, что я звоню deleteBackward() 10000 раз.

Есть ли более быстрый способ удалить весь текст?

+0

Не можете ли вы установить атрибут 'text' UITextView'/'UITextField' в пустую строку? – NRitH

+0

Кроме того, этот вопрос не имеет ничего общего с пользовательскими клавиатурами. Речь идет только о 'UIDocument' и 'UITextView'. – NRitH

+1

Он имеет все, что связано с пользовательскими клавиатурами. Я делаю расширения приложений, которое представляет собой приложение, которое устанавливает пользовательскую клавиатуру для пользователя, который пользователь может использовать там, где захочет. Таким образом, я не могу получить доступ к объекту UITextfield, потому что пользовательская клавиатура имела ограниченное количество способов взаимодействия с текстом. – Roymunson

ответ

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.