4

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:@""];  
    }
}

残念ながら、これは機能していません。これ:

  1. 空のアイテムを元に戻すスタックに導入します (「元に戻す」)
  2. その項目の後に「Undo Clear」が追加されます(「Undo」をタップすると、「Undo Clear」が表示されます)
  3. ただし、[クリアを元に戻す] と [クリアをやり直す] は機能しますが、[クリアを元に戻す] が再び表示され、それ以降は機能しません。

何か案は?私はこれに間違って近づいていますか?

更新:空の元に戻すアイテムの問題を把握したようです: prepareWithInvocationTargetを呼び出した後に UITextView のテキストを設定すると発生します。以前に呼び出した場合、それは起こりません。面白いことに、prepareWithInvocationTarget を呼び出さないと (つまり、通常は UITextView のテキストを設定するとき)、空のアイテムが元に戻すスタックにプッシュされません。

4

3 に答える 3

3

OK、それを理解しました:

#1の問題は、元の投稿の更新で概説されているとおりです。

問題 #2 と #3 は、私が NSUndoManager を間違って使用したことによるものです。私の最後の unClear メソッド (元に戻すときに呼び出されるメソッドは次のとおりです。

-(void)undoClear:(NSString *)textToRestore
{   
    NSString *textBackup = [self.myTextView.text コピー];

    self.myTextView.text = textToRestore;

    if ([self.myTextView.undoManager isUndoing])
    {
        // やり直しを準備します。
        [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:@""];     
    }
    else if ([self.myTextView.undoManager isRedoing])
    {
        [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:textBackup];
    }

    [textBackup リリース];
}

現在は正常に機能しています。

于 2010-11-01T18:00:47.893 に答える
1

テキストビューを任意のテキストに変更し、元に戻すおよびやり直しマネージャーのメモリ スタックを保持できます。self.content は UITextView です。

-(void) yourClearAllButtonIsPressed
{
    [[self.content.undoManager prepareWithInvocationTarget:self] undoClear:self.content.text];
    [self.content setText:@""];//Or something else you want to change your textview to
}

}

// 1 つだけ、私が作成したメソッド

-(void) undoClearBlablabla:(NSString*) text
    {
        [[self.content.undoManager prepareWithInvocationTarget:self] undoClear:self.content.text];
        [self.content setText:text];
    }
于 2013-10-30T15:12:44.917 に答える
0

私はあなたが作業しているテキストフィールドの数を訴えていませんが、textBackupいくつprepareWithInvocationTarget:かのクリアが後で元に戻すスタックに残っているのはどうですか? 2回目以降または自動解放プールのフラッシュ後ではありませんが、1回目以降はまだ残っているようです。

于 2012-03-20T21:12:51.293 に答える