我有一个实现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使用自己的子类...因此我愿意征求建议。

最佳答案

我的解决方案包含在问题的更新中。

关于iphone - 如何对NSUndoManager + UITextInput的击键进行分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13954372/

10-10 20:29