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 の独自のサブクラスを操作する必要がないようにしたかったので、提案をお待ちしています。