Основы NSUndoManager
Я сделал приложение, в котором есть кнопка, когда вы нажимаете ее, она отключается, и действие по отмене должно вернуть ее в предыдущее состояние (включить). Я использовал NSUndoManager, чтобы сделать это возможным, но это не работает. Кажется, я упускаю что-то важное в своем приложении, но не могу найти, что именно.
AppDelegate.h:
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
NSUndoManager* undoManager;
}
@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSButton *button;
- (IBAction)Disable:(id)sender;
@end
AppDelegate.m:
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
- (NSUndoManager*)windowWillReturnUndoManager:(NSWindow*)window
{
return undoManager;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
}
- (id) init
{
if(self = [super init])
undoManager = [[NSUndoManager alloc]init];
return self;
}
- (IBAction)Disable:(id)sender
{
[[undoManager prepareWithInvocationTarget:self]Enable];
[_button setEnabled:NO];
if (![undoManager isUndoing])
[undoManager setActionName:@"Disable"];
}
-(void)Enable
{
[[undoManager prepareWithInvocationTarget:self]Disable:self];
[_button setEnabled:YES];
if (![undoManager isUndoing])
[undoManager setActionName:@"Enable"];
}
@end
Что я делаю неправильно?
1 ответ
Я изменил ваш код и надеюсь, что мой пример вам поможет.
Пожалуйста, сообщите мне, если у вас все еще есть проблемы =)
#import "AppDelegate.h"
@interface AppDelegate ()
{
NSUndoManager* undoManager;
}
@property (weak) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSButton *button;
@property (weak) IBOutlet NSButton *undoButton;
@end
@implementation AppDelegate
- (NSUndoManager*)windowWillReturnUndoManager:(NSWindow*)window
{
return undoManager;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
undoManager = [[NSUndoManager alloc]init];
[self update];
}
- (IBAction)Disable:(id)sender
{
[[undoManager prepareWithInvocationTarget:self]Enable];
[_button setEnabled:NO];
if (![undoManager isUndoing])
[undoManager setActionName:@"Disable"];
[self update];
}
- (IBAction)undo:(id)sender
{
[undoManager undo];
[self update];
}
-(void)Enable
{
[[undoManager prepareWithInvocationTarget:self]Disable:self];
[_button setEnabled:YES];
if (![undoManager isUndoing])
[undoManager setActionName:@"Enable"];
[self update];
}
- (void)update
{
self.undoButton.title = [undoManager canUndo]?@"Undo":@"Can't undo";
}
@end