2

UITextInput を実装するビューがあり、元に戻すのサポートを追加しました。現在、個々のキー ストロークまたはバックスペースは、取り消し可能なイベントとして記録されます。

イベントをグループ化できることと、最初のキーストロークで元に戻すグループを開くことができることを知っています。しかし、どこに行ってグループを閉じるのでしょうか? ユーザーがデバイスを振ったときにグループが開いていると、例外が発生します。元に戻すときにグループを開くことはできません。

NSUndoManager インスタンスがアクション メニューを表示する直前に、何らかの形で開いているグループを閉じる必要があります。

そのために NSUndoManager をサブクラス化する必要がありますか? または、アクションの前に入力元に戻すグループを閉じる方法を知っている人はいますか?

注: 元に戻すアクションを表示する場合、ファーストレスポンダーは辞任しません。

実際、通常のテキスト入力では、入力グループが何らかの形で開いたままになっているように見えます。元に戻す/やり直しアラートをキャンセルすると、入力を続けることができ、その後すべてのキーストロークをまとめて元に戻すことができるからです。

アクションをグループ化するタイミングと、グループを閉じる必要があるかどうか、いつグループを閉じる必要があるかがわかりません。

更新: 以下が機能していることがわかりました: 開いているグループの数を追跡する NSUndoManager のサブクラスを作成しました。-undo で、例外を回避するために開いているすべてのグループを閉じてから呼び出します[super undo]

#import "DTUndoManager.h"

@implementation DTUndoManager
{
    NSUInteger _numberOfOpenGroups;
}

- (void)beginUndoGrouping
{
    _numberOfOpenGroups++;

    [super beginUndoGrouping];
}

- (void)endUndoGrouping
{
    _numberOfOpenGroups--;

    [super endUndoGrouping];
}

- (void)closeAllOpenGroups
{
    while (_numberOfOpenGroups>0)
    {
        [self endUndoGrouping];
    }
}

- (void)undo
{
    [self closeAllOpenGroups];

    [super undo];
}

#pragma mark - Properties

@synthesize numberOfOpenGroups = _numberOfOpenGroups;

@end

段落スタイルの変更など、新しい操作が開始されるたび[self.undoManager closeAllOpenGroups]に、入力の元に戻すグループを閉じる呼び出しを呼び出します。

-deleteBackward:メソッドとメソッドで-insertText:、新しい入力ブロックを開始する必要があることを知っています。

- (void)insertText:(NSString *)text
{
    DTUndoManager *undoManager = (DTUndoManager *)self.undoManager;
    if (!undoManager.numberOfOpenGroups)
    {
        [self.undoManager beginUndoGrouping];
    }

これは余分なコードではありませんが、DTUndoManager の独自のサブクラスを操作する必要がないようにしたかったので、提案をお待ちしています。

4

1 に答える 1

0

私の解決策は、質問の更新に含まれています。

于 2012-12-31T11:19:52.020 に答える