Помогите с NSUndoManager - PullRequest
       67

Помогите с NSUndoManager

0 голосов
/ 03 апреля 2011

Хорошо, я хочу добавить возможность отмены определенных действий в моем приложении.Я собирался создать способ сделать это, используя мои собственные протокалы или что-то еще, но потом я узнал о NSUndoManager.Я хотел бы использовать встроенный способ основания, но я не могу понять это.Мне нужно отменить несколько бросков костей, поэтому, если бы я мог сохранить предыдущие броски, как объекты в NSArray, вероятно, будет лучшим.Я мог бы использовать NSMutableString, но массив был бы более предпочтительным.

Тогда я знаю, что вы можете встряхнуть, чтобы отменить, но я бы предпочел кнопку.Это доставляет мне больше всего хлопот.Я включил мои попытки ниже.Ни один из тех не работал.Любая помощь будет оценена.

В viewDidLoad:

undoManager = [[NSUndoManager alloc] init];

Затем в методе, который бросает кости, я попытался:

   [[undoManager prepareWithInvocationTarget:self] undoButton];
    [[undoManager prepareWithInvocationTarget:self] 
    [[undoManager prepareWithInvocationTarget:self] setString:[NSString stringWithFormat:@"%i", dice1num]];

setStrings:[NSArray arrayWithObjects:[NSString stringWithFormat:@"%i", dice1num]
    [NSString stringWithFormat:@"%i", dice1num],
    [NSString stringWithFormat:@"%i", dice1num],
    [NSString stringWithFormat:@"%i", dice1num],
    [NSString stringWithFormat:@"%i", dice1num], nil]];
[[undoManager prepareWithInvocationTarget:@selector()];
[undoManager setActionName:@"A roll"];

И вот здесьIBAction, который ссылается на кнопку отмены:

-(IBAction)undoButton{
           [undoManager undo];
}

Заранее спасибо

1 Ответ

5 голосов
/ 03 апреля 2011

Я думаю, вы неправильно поняли функцию NSUndoManager.Менеджер отмены похож на стек вызовов, которые необходимы, чтобы полностью изменить то, что вы только что сделали.Таким образом, в принципе ваша идея заключается в том, чтобы использовать объект коллекции в вашем случае NSArray для хранения нескольких шагов отмены.К сожалению, он работает немного по-другому.

Как NSUndoManager работает

Менеджер отмены работает, поддерживая стек шагов отмены в памяти.Для каждого шага в вашем броске кубика, который вы хотите отменить, вы регистрируете объект вызова, используя метод - (void)registerUndoWithTarget:self selector:@selector(setMyObjectTitle:) object:currentTitle.Вы делаете это для каждого броска костей.Регистрируйте только одну операцию за раз.

Для отмены вы вызываете метод отмены, как вы это сделали, и в результате происходит то, что менеджер отмены извлекает операцию из стека отмены и выполняет ее.

Ваша главная ошибка состояла в том, чтобы попытаться заново изобразить, как работает менеджер отмены.Не регистрируйте массив, просто используйте один бросок костей за раз.

Руководство по отмене архитектуры Apple

...