我有一个实现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/