2016-06-21 10 views
0

現在、私のiOSカスタムキーボードにはすべて削除ボタンがあります。クリックされたとき、ここでそのコードは次のとおりです。iOSカスタムキーボードはすべて削除ボタンを作成します

func deletekeyPressed(sender: UIButton!) { 

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

} 

問題は、私はすべてのテキストが削除される前に顕著な休止があり、ボタンをクリックしたときに、です。私はdeleteBackward()を10000回呼んでいるので、これは確かです。

すべてのテキストをすばやく削除する方法はありますか?

+0

'UITextView' /' UITextField'の 'text'属性を空文字列に設定することはできませんか? – 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イベントを返すために不自然に長くかかる場合に失敗する可能性があることです。

関連する問題