我在我的 undoManager 撤消/重做堆栈中得到了空的撤消/重做组。因此在许多情况下将 canUndo/canRedo 设置为 TRUE。如何避免这种情况?
问问题
388 次
2 回答
2
我避免这种情况的一种方法是检测何时创建了一个空事件,然后默默地撤消它。在一个子类中NSUndoManager
:
@interface MyUndoManager : NSUndoManager
@property BOOL haveReceivedInvocationPreparation;
@end
@implementation MyUndoManager
- (instancetype)init {
self = [super init];
if (self) {
self.haveReceivedInvocationPreparation = NO;
}
return self;
}
- (void)endUndoGrouping {
[super endUndoGrouping];
if (self.groupingLevel == 0) {
if (!self.haveReceivedInvocationPreparation && !self.isUndoing) {
[self disableUndoRegistration];
[self undo];
[self enableUndoRegistration];
}
self.haveReceivedInvocationPreparation = NO;
}
}
- (id)prepareWithInvocationTarget:(id)target {
self.haveReceivedInvocationPreparation = YES;
return [super prepareWithInvocationTarget:target];
}
@end
到目前为止,这似乎运作良好,我还没有看到任何奇怪的行为。
于 2016-05-04T21:21:46.513 回答
0
AFAIK,您无法避免 NSUndoManager 将空撤消组计为有效撤消操作。一种解决方案是使用 GCUndoManager,它试图解决空组的问题,请参阅http://apptree.net/gcundomanager.htm
于 2013-06-07T13:30:10.000 回答