Очистка стека повторов NSUndoManager - PullRequest
2 голосов
/ 18 апреля 2011

В моем приложении есть некоторые действия, которые я хочу отменить программно, не давая пользователю возможность нажать «Повторить». Есть ли способ очистить стек Redo NSUndoManager? Если нет, и я должен был подкласс NSUndoManager, есть ли способ получить доступ к стеку повторов, чтобы очистить его? Я не видел выхода из документации.

С другой стороны, есть ли способ отменить изменения из текущей вложенной группы отмены без ее заполнения стека повторения? Я уже создаю вложенную группу отмены.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Я остановился на двухэтапном подходе.Первым шагом было создание фиктивного элемента отмены, который очищает стек повторения.Затем мне просто нужно было удалить этот элемент отмены, и оба стека были чистыми.

Я смог использовать self в качестве фиктивной цели отмены, поскольку у меня нет каких-либо фактических действий отмены, связанных скласс, содержащий код.self можно заменить любым объектом, который не вносит вклад в стек отмены.

Трюк вызывал removeAllActionsWithTarget с задержкой, в противном случае он не дает эффекта.

// End the open undo grouping
[undoManager endUndoGrouping];

// Perform the undo operation, which gets pushed onto the Redo stack
[undoManager undo];

// Add a dummy Undo item to clear the Redo stack
[undoManager registerUndoWithTarget:self selector:nil object:nil];

// Remove the dummy item with a delay, pushing it to the next run loop cycle
[undoManager performSelector:@selector(removeAllActionsWithTarget:)
                  withObject:self
                  afterDelay:0.0];
1 голос
/ 18 апреля 2011
[undoManager disableUndoRegistration];
[undoManager undo];
[undoManager enableUndoRegistration];
...