1

我在我的 undoManager 撤消/重做堆栈中得到了空的撤消/重做组。因此在许多情况下将 canUndo/canRedo 设置为 TRUE。如何避免这种情况?

4

2 回答 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 回答