UITextView に常にフォーカスがあるビューがあります。私がやりたいことは、組み込みの元に戻す/やり直し動作を拡張して、プログラムでテキストを設定するときの元に戻す/やり直しをサポートすることです (たとえば、テキストを @"" に設定してクリアするとき)。
元に戻す/やり直しイベントを取得するのは firstResponder だけなので、UITextView の undoManager プロパティを使用して呼び出しを作成するだけでよいと考えました。例えば、
// テキストをクリアする前に...
[[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:self.myTextView.text];
[self.myTextView.undoManager setActionName:@"Clear"];
// ...
-(void)undoClear:(NSString *)textToRestore
{
self.myTextView.text = textToRestore;
if ([self.myTextView.undoManager isUndoing])
{
// やり直しを準備します。
[[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:@""];
}
}
残念ながら、これは機能していません。これ:
- 空のアイテムを元に戻すスタックに導入します (「元に戻す」)
- その項目の後に「Undo Clear」が追加されます(「Undo」をタップすると、「Undo Clear」が表示されます)
- ただし、[クリアを元に戻す] と [クリアをやり直す] は機能しますが、[クリアを元に戻す] が再び表示され、それ以降は機能しません。
何か案は?私はこれに間違って近づいていますか?
更新:空の元に戻すアイテムの問題を把握したようです: prepareWithInvocationTargetを呼び出した後に UITextView のテキストを設定すると発生します。以前に呼び出した場合、それは起こりません。面白いことに、prepareWithInvocationTarget を呼び出さないと (つまり、通常は UITextView のテキストを設定するとき)、空のアイテムが元に戻すスタックにプッシュされません。