2015-03-24 2 views
0

Я восторженный 16-летний программист, и сейчас я работаю над приложением, простым, у которого есть только кнопка, которая добавляет 1 к целому числу и отображает ее на ярлыке, & Я хотел бы добавить кнопку отмены. Я исследовал NSUndoManager, который должен помочь. Дело в том, что я не могу заставить его работать! Этот вопрос может показаться очевидным, но я узнал все, что знаю с youtube, и поэтому не знаю много чего. Это мой код:NSUndoManager Disaster

@implementation ViewController 

NSUndoManager *undoManager; 

-(IBAction)add1:(id)sender{ 

    Count = Count + 1; 

    Counter.text = [NSString stringWithFormat:@"%i", Count]; 

    [undoManager prepareWithInvocationTarget:self]; 

    [undoManager registerUndoWithTarget:self selector:@selector(add1:) object:Counter.text]; 
    [undoManager setActionName:NSLocalizedString(@"actions.update", @"Update Score")]; 
} 

-(IBAction)Undo:(id)sender{ 

    [undoManager undo]; 
    Counter.text = [NSString stringWithFormat:@"%i", Count]; 
} 

- (void)viewDidLoad { 

    Count = 0; 

    undoManager =[[NSUndoManager alloc]init]; 

    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
@end 

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

Спасибо!

+0

Объясните, что на самом деле происходит, когда вы отменяете, и как вы запускаете отмену. – Wain

+0

Попробуйте поместить три строки кода для вашего 'undoManager' из вашего метода' add1' в ваш метод жизненного цикла 'viewDidLoad', после того как вы выделите/'undoManager'. Это помогает? – andrewbuilder

+0

Как это сделать? Возможно, пример кода поможет. –

ответ

0

Вам нужен метод, противоположный вашему методу -add1:. Затем вам нужно установить, что в качестве селектора для действия отмен:

- (IBAction) add1:(id)sender 
{ 
    Count = Count + 1; 
    Counter.text = [NSString stringWithFormat:@"%i", Count]; 

    [undoManager registerUndoWithTarget:self selector:@selector(subtract1:) object:sender]; 
    [undoManager setActionName:NSLocalizedString(@"Increment Score", @"Name for undo action")]; 
} 

- (IBAction) subtract1:(id)sender 
{ 
    Count = Count - 1; 
    Counter.text = [NSString stringWithFormat:@"%i", Count]; 

    [undoManager registerUndoWithTarget:self selector:@selector(add1:) object:sender]; 
    [undoManager setActionName:NSLocalizedString(@"Decrement Score", @"Name for undo action")]; 
} 

Таким образом, путь, который -add1: расстегнут является вызовом -subtract1: и способ, которым -subtract1: расстегнут является вызовом -add1:. Кроме того, поскольку -subtract1: регистрирует действие отмены, это означает, что вы получаете функциональность повтора. (Действие отмены зарегистрировано в процессе погибель понимается действие повтора, если пользователь выбирает, чтобы повторить то, что они расстегнули.)

Примечание: вы не используете -prepareWithInvocationTarget: при использовании -registerUndoWithTarget:.... Вы используете тот или иной.

Кроме того, вашему методу -Undo: не нужно устанавливать Counter.text, потому что это должно быть сделано автоматически действием отмены.

+0

Итак, если я делаю большое приложение, которое получает статистику бейсбольной игры, например, мне придется писать весь код, но назад? Или есть способ управлять целой программой, чтобы изменения регистрировались, а затем программа просто сбрасывала все это до того, что было до того, как произошло последнее изменение? –

+0

Я не думаю об этом, как о чем-то писать. В любой типичной программе вы все равно будете обеими обеими операциями. Вы также можете написать свой код более общим способом, например, иметь метод, который добавляет заданное значение в счетчик, а не обязательно 1. Затем вы можете вызвать его с помощью 1 для операции приращения и зарегистрировать отмененную операцию, которая вызывает себя за исключением того, что значение отрицается. (То есть ваш упрощенный пример метода '-add1:' слишком прост и, следовательно, нереалистичен. Более реалистичный код не потребует такого неудобного метода для действия отмены.) –

Смежные вопросы