2016-06-21 17 views
0

Zur Zeit hat meine iOS benutzerdefinierte Tastatur eine Schaltfläche "Alle löschen". Hier ist ihr Code, wenn darauf geklickt:iOS benutzerdefinierte Tastatur machen eine Schaltfläche "Alle löschen"

func deletekeyPressed(sender: UIButton!) { 

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

} 

Das Problem ist, wenn ich auf die Schaltfläche klicken gibt es eine spürbare Pause, bevor der gesamte Text gelöscht wird. Ich bin mir ziemlich sicher, dass dies ist, weil ich deleteBackward() 10000 Mal anrufe.

Gibt es eine schnellere Möglichkeit, den gesamten Text zu löschen?

+0

Können Sie nicht einfach das Attribut 'text' von' UITextView'/'UITextField' auf eine leere Zeichenfolge setzen? – NRitH

+0

Diese Frage hat auch nichts mit benutzerdefinierten Tastaturen zu tun. Es geht nur um 'UIDocument's und' UITextView's. – NRitH

+1

Es hat alles mit benutzerdefinierten Tastaturen zu tun. Ich mache eine App-Erweiterungen, die eine App ist, die eine benutzerdefinierte Tastatur für den Benutzer installiert, die der Benutzer verwenden kann, wo immer sie möchten. Daher kann ich nicht auf das UITextfield-Objekt zugreifen, da eine benutzerdefinierte Tastatur über eine begrenzte Anzahl von Möglichkeiten verfügt, mit dem Text zu interagieren. – Roymunson

Antwort

0

Wenn Sie 10000 Mal deleteBackwards aufrufen, bedeutet dies, dass 10000 deleteBackwards-Befehle in eine Repräsentation serialisiert werden müssen, die über XPC übertragen, an den Hostprozess gesendet, deserialisiert und dann angewendet werden können. Dies könnte die Ursache für Ihre Verzögerung sein.

Ich würde Ihre deleteBackwards Aufrufe in Stücke, die nicht mehr löschen als den aktuellen Dokumentkontext, die Sie verfügbar sind, dann warten Sie auf den nächsten textDidChange Anruf, und wenn es innerhalb von X Millisekunden des letzten ist, löschen Sie einige mehr mit dem neuer Kontext, da Sie ziemlich sicher sein können, dass der Benutzer nicht so schnell auf ein anderes Textfeld getippt hat, nachdem Sie auf die Schaltfläche geklickt haben.

Unten ist ein Pseudocode, der zeigt, was ich meine.

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() 
} 

Dieser Ansatz hat den Vorteil, nicht unnötige Arbeit zu tun, und sogar arbeiten, wenn es mehr als 10000 Zeichen in dem Dokument der Benutzer die Bearbeitung. Der Nachteil ist, dass es fehlschlagen kann, wenn der Hostprozess unnatürlich lange dauert, um ein textDidChange-Ereignis zurückzusenden.